3

假设我有两个 json 文件。我希望能够同时加载两者,然后将第二个条目添加到第一个条目中。这可能包括添加字段或列表条目。类似于以下示例:

file1.json: { "fruit": [ { "name": "apple", "color": "red" }, { "name": "orange", "color": "orange" } ] }

file2.json: { "fruit": [ { "name": "strawberry", "color": "red", "size": "small" }, { "name": "orange", "size": "中等的” } ] }

结果:{“水果”:[{“名称”:“苹果”,“颜色”:“红色”},{“名称”:“橙色”,“颜色”:“橙色”,“大小”:“中等” },{“名称”:“草莓”,“颜色”:“红色”,“尺寸”:“小”}]}

起初我想将它们加载到字典中并尝试更新:

import simplejson

filea = open("file1.json", 'r')
dicta = simplejson.loads(filea.read())

fileb = open("file2.json", 'r')
dictb = simplejson.loads(fileb.read())

filea.close()
fileb.close()

dicta.update(dictb)

由于两个字典都有一个“fruit”条目,我希望它们会合并,但它只是用 dictb 中的条目覆盖了 dicta 中的条目。

我意识到我可以编写代码来循环遍历这个示例,但是我使用的实际文件要大得多且复杂得多。我想知道在我重新发明轮子之前是否有一个图书馆已经做了类似的事情。对于它的价值,我使用的是 Python 2.6.2。

感谢您的任何意见或建议!

4

2 回答 2

6

您需要扩展检查每个值的列表。Python 现在无法根据name字典项合并它们:

def merge(lsta, lstb):
    for i in lstb:
        for j in lsta:
            if j['name'] == i['name']:
                j.update(i)
                break
        else:
            lsta.append(i)

for k,v in dictb.items():
    merge(dicta.setdefault(k, []), v)

所以dicta变量将是:

{'fruit': [{'color': 'red', 'name': 'apple'}, 
           {'color': 'orange', 'name': 'orange', 'size': 'medium'},
           {'color': 'red', 'name': 'strawberry', 'size': 'small'}]}
于 2012-09-05T16:02:50.313 回答
0

给定列表中已解析的 json parsed_json

transformed_data = []
for data in parsed_json:
    transformed_data.append({})
    for fruit in data['fruit']:
        fruit_copy = fruit.copy()
        transformed_data[-1][fruit_copy.pop('name')] = fruit_copy
merged_fruit = defaultdict(dict)
for name, values in transformed_data.iteritems():
    merged_fruit[name].update(values)

您可以使用 2.7+ 中的 dict 理解来做到这一点,但您说的是 2.6.2。鉴于您的陈述,在现实世界中,您正在合并多个字段,您可以在将transformed_data成员设置为您想要的源中的任何字段时更改键。如果您不关心破坏原始解析数据,您也可以删除copy.

于 2012-09-05T16:13:44.313 回答