2017-06-22 107 views
0

我有一个包含多个键和值的字典,其值也包含键值对。我没有得到如何创建在python中使用这个字典的动态json。这里的字典:在python中创建动态json对象

image_dict = {"IMAGE_1":{"img0":"IMAGE_2","img1":"IMAGE_3","img2":"IMAGE_4"},"IMAGE_2":{"img0":"IMAGE_1", "img1" : "IMAGE_3"},"IMAGE_3":{"img0":"IMAGE_1", "img1":"IMAGE_2"},"IMAGE_4":{"img0":"IMAGE_1"}} 

我预期的结果是这样的:

{ 
    "data": [ 
    { 
     "image": { 
     "imageId": { 
      "id": "IMAGE_1" 
     }, 
     "link": { 
      "target": { 
      "id": "IMAGE_2" 
      }, 
      "target": { 
      "id": "IMAGE_3" 
      }, 
      "target": { 
      "id": "IMAGE_4" 
      } 
     } 
     }, 
     "updateData": "link" 
    }, 
     { 
     "image": { 
     "imageId": { 
      "id": "IMAGE_2" 
     }, 
     "link": { 
      "target": { 
      "id": "IMAGE_1" 
      }, 
      "target": { 
      "id": "IMAGE_3" 
      } 
     } 
     }, 
     "updateData": "link" 
    }, 
    { 
     "image": { 
     "imageId": { 
      "id": "IMAGE_3" 
     }, 
     "link": { 
      "target": { 
      "id": "IMAGE_1" 
      }, 
      "target": { 
      "id": "IMAGE_2" 
      } 
     } 
     }, 
     "updateData": "link" 
    } , 
    { 
     "image": { 
     "imageId": { 
      "id": "IMAGE_4" 
     }, 
     "link": { 
      "target": { 
      "id": "IMAGE_1" 
      } 
     } 
     }, 
     "updateData": "link" 
    } 
    ] 
} 

我试图解决这个问题,但我没有得到预期的结果。

result = {"data":[]} 

for k,v in sorted(image_dict.items()): 
    for a in sorted(v.values()): 
     result["data"].append({"image":{"imageId":{"id": k}, 
             "link":{"target":{"id": a}}},"updateData": "link"}) 
print(json.dumps(result, indent=4)) 
+0

的'json'部分是完全(当然,大部分)在这里无关,你的问题是“怎么办我将这个源词典转换为目标字典 –

+0

是的,你的权利@brunodesthuilliers –

+0

@rajendrapawar,你的预期的json是无效的在一个dict“..”链接中不能有重复的键:{ “target”:{ “ID”: “IMAGE_2” }, “目标”:{ “ID”: “IMAGE_3” }, “目标”:{ “ID”: “IMAGE_4” } ..' – RomanPerekhrest

回答

0

在Python字典中,您不能使用相同的键具有2个值。所以你不能有多个目标被称为“目标”。所以你可以索引它们。此外,我不知道这是什么问题,有动态对象做,但这里是我得到了工作代码:

import re 
dict_res = {} 
ind = 0 
for image in image_dict: 
    lin_ind = 0 
    sub_dict = {'image' + str(ind): {'imageId': {image}, 'link': {}}} 
    for sub in image_dict[image].values(): 
     sub_dict['image' + str(ind)]['link'].update({'target' + str(lin_ind): {'id': sub}}) 
     lin_ind += 1 
    dict_res.update(sub_dict) 
    ind += 1 
dict_res = re.sub('target\d', 'target', re.sub('image\d', 'image', str(dict_res))) 
print dict_res 
+0

这是什么不同于索引号? – cookiedough

+0

你可以把它变成一个字符串。并使用re函数。我对代码做了编辑,为你做了这个。 – cookiedough