2017-08-26 149 views
-2

我有2个字符,如果1个键('ID)匹配,我需要将特定的值合并成一个新的字典。当他们被嵌套,并在不同的层次,我只是无法弄清楚如何,甚至周围玩了几个小时,看教程后...合并python中的JSON文件

这里有2个jsons

1 JSON

的快照
{ 
"product": [ 
    { 
     "books": [ 
      { 
       "release": "2017-07-30", 
       "status": "H", 
       "Title-EN": "EN-TITLE-NAME", 
       "Title-DE": "DE-TITLE-NAME", 
       "restriction": 1, 
       "id": 467541241, 
       "onstore": 1 
      }, 

第二JSON

{ 
"products": [ 
    { 
     "books": [ 
      { 
       "periods": [ 
        { 
         "publID": 45547514, 
         "number": 0, 
         "price": { 
          "en": 12, 
          "de": 15 
         } 
        } 
       ], 
       "id": 467541241 
      }, 

我试图让这些匹配和输出这样的,基本上只是增加两个价键的地方的ID匹配:

{ 
"product": [ 
{ 
    "books": [ 
     { 
      "release": "2017-07-30", 
      "status": "H", 
      "Title-EN": "EN-TITLE-NAME", 
      "Title-DE": "DE-TITLE-NAME", 
      "restriction": 1, 
      "id": 467541241, 
      "onstore": 1 
      "price-en": 12, 
      "price-de": 15, 
     }, 

任何暗示我如何能做到这一点将是伟大的!

感谢

+0

请添加你试过的东西。由于存在如此多的类似问题,这个问题不会被广泛接受。 – roganjosh

+1

将JSON加载到Python中只会为您提供Python列表和字典,字符串和数字。这里没有什么特别的JSON。 –

+0

“句点”是一个列表,因此它可能有多个值,因此有多个价格。然后怎样呢? –

回答

0

任何暗示我怎样才能做到这将是巨大的!

让我们打电话给你的两个结构data1data2

我建议首先迭代data2并创建一个映射<id : {price}>,将其称为price_mapping

price_mapping = {x['id'] : x['periods'][0]['price'] 
        for x in data2['products'][0]['books'] 
       } 

现在,遍历data1,并在每次迭代中,检查id条目是否存在于price_mapping的关键。如果是,更新data1,否则继续下一个。

for d in data1['product'][0]['books']: 
    d.update({'price_' + k : v for k, v in price_mapping.get(d['id'], {}).items()}) 

print(data1) 

{'product': [{'books': [{'Title-DE': 'DE-TITLE-NAME', 
    'Title-EN': 'EN-TITLE-NAME', 
    'id': 467541241, 
    'onstore': 1, 
    'price_de': 15, 
    'price_en': 12, 
    'release': '2017-07-30', 
    'restriction': 1, 
    'status': 'H'}]}]} 
+1

1.您不需要第一个代码中的尾部斜线,因为线段延续隐含在未封闭的大括号内。 2.您可以通过用'price_mapping.get(d ['id'],{})''替换'price_mapping [d ['id']]'来丢失'if'。 –

+0

@AlexHall伟大的建议。谢谢。 –

0

我认为以下可能会有所帮助。这两个嵌套的for循环是检查第一个json中每本书的id匹配以及第二个json中的所有书籍。无论如何,您应该了解如何从下面的代码访问字典中的嵌套数据。我假设你已经阅读了python中的jsons。

json_1 = <your first json> 
json_2 = <your second json> 
for book1 in json_1['product']['books']: 
    for book2 in json_2['product']['books']: 
     if book1['id'] == book2['id']: 
      json_1['product']['books']['price-en'] = book2['periods'][0]['price']['en'] 
      json_1['product']['books']['price-de'] = book2['periods'][0]['price']['de']