【问题标题】:Update JSON format from other JSON file从其他 JSON 文件更新 JSON 格式
【发布时间】:2020-04-17 06:26:50
【问题描述】:

我有两个文件,分别是 a 和 b。我想将某些信息从数据 b 导入到具有每个响应的唯一 ID 的数据 a 中。

数据

a= [{'id':'abc23','name':'aa','age':'22',
     'data':{'read':'','speak':''},
     'responses':{'a':1,'b':2}},
     {'id':'abc25','name':'bb','age':'32',
      'data':{'read':'','speak':''},
      'responses':{'a':1,'b':2}},
    {'id':'abc60','name':'cc','age':'24',
     'data':{'read':'','speak':''},
     'responses':{'a':1,'b':2}}]

b=[{'id':'abc23','read':'2','speak':'abc','write':'2'},
   {'id':'abc25','read':'3','speak':'def','write':'3'},
   {'id':'abc60','read':'5','speak':'dgf','write':'1'}]

我用来从 b 导入到 a 的代码:

from pprint import pprint

for dest in a:
    for source in b:
        if source['id'] == dest['id']:
            dest['data'].update(source)
pprint(a)

我使用的代码的输出:

[{  'age': '22',
    'data': {'id': 'abc23', 'read': '2', 'speak': 'abc', 'write': '2'},
    'id': 'abc23',
    'name': 'aa',
    'responses': {'a': 1, 'b': 2}},
 {  'age': '32',
    'data': {'id': 'abc25', 'read': '3', 'speak': 'def', 'write': '3'},
    'id': 'abc25',
    'name': 'bb',
    'responses': {'a': 1, 'b': 2}},
 {  'age': '24',
    'data': {'id': 'abc60', 'read': '5', 'speak': 'dgf', 'write': '1'},
    'id': 'abc60',
    'name': 'cc',
    'responses': {'a': 1, 'b': 2}}]

但是...这是我想要的输出:

[{'age': '22',
  'data': {'read': '2', 'speak': 'abc'},
  'id': 'abc23',
  'name': 'aa',
  'responses': {'a': 1, 'b': 2}},
 {'age': '32',
  'data': {'read': '3', 'speak': 'def'},
  'id': 'abc25',
  'name': 'bb',
  'responses': {'a': 1, 'b': 2}},
 {'age': '24',
  'data': {'read': '5', 'speak': 'dgf'},
  'id': 'abc60',
  'name': 'cc',
  'responses': {'a': 1, 'b': 2}}]

【问题讨论】:

    标签: python json merge


    【解决方案1】:

    它不能以您想要的方式使用您的代码。

    你会的

    dest['data'].update(source)

    来源在哪里 {'id':'abc23','read':'2','speak':'abc','write':'2'}

    dest['data']{'read':'','speak':''}

    当您update 时,它会将所有键值对添加到dest['data'] 并保留不会被覆盖的键值对。

    from pprint import pprint
    
    for dest in a:
        for source in b:
            if source['id'] == dest['id']:
                dest['data'] = {k: v for k, v in source.items() if k in dest.get('data', {})}
    
    pprint(a)
    

    这将查找每种情况下“可更新”的所有字段。您可能需要对其进行硬编码,具体取决于您的用例。

    【讨论】:

      【解决方案2】:

      这是一种将b 更改为dict 以便于查找的方法。

      例如:

      a= [{'id':'abc23','name':'aa','age':'22',
           'data':{'read':'','speak':''},
           'responses':{'a':1,'b':2}},
           {'id':'abc25','name':'bb','age':'32',
            'data':{'read':'','speak':''},
            'responses':{'a':1,'b':2}},
          {'id':'abc60','name':'cc','age':'24',
           'data':{'read':'','speak':''},
           'responses':{'a':1,'b':2}}]
      
      b=[{'id':'abc23','read':'2','speak':'abc','write':'2'},
         {'id':'abc25','read':'3','speak':'def','write':'3'},
         {'id':'abc60','read':'5','speak':'dgf','write':'1'}]
      
      b = {i.pop('id'): i for i in b}   #Convert to dict key = ID & value = `read`, `speak`, `write`
      
      for i in a:
          i['data'].update(b[i['id']])   #Update list
      print(a)
      

      输出:

      [{'age': '22',
        'data': {'read': '2', 'speak': 'abc', 'write': '2'},
        'id': 'abc23',
        'name': 'aa',
        'responses': {'a': 1, 'b': 2}},
       {'age': '32',
        'data': {'read': '3', 'speak': 'def', 'write': '3'},
        'id': 'abc25',
        'name': 'bb',
        'responses': {'a': 1, 'b': 2}},
       {'age': '24',
        'data': {'read': '5', 'speak': 'dgf', 'write': '1'},
        'id': 'abc60',
        'name': 'cc',
        'responses': {'a': 1, 'b': 2}}]
      

      【讨论】:

      • 谢谢,但我想要的第一个输出没有“写”。你有什么想法吗?
      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2022-09-30
      相关资源
      最近更新 更多