假设我有两个json文件。我希望能够加载两者,然后将第二个条目添加到第一个。这可能包括添加字段或列表条目。类似下面的例子:
file1.json:{“fruit”:[{“name”:“apple”,“color”:“red”},{“name”:“orange”,“color”:“orange”}]}
file2.json:{“fruit”:[{“name”:“strawberry”,“color”:“red”,“size”:“small”},{“name”:“orange”,“size” “:”medium“}]}
结果:{“fruit”:[{“name”:“apple”,“color”:“red”},{“name”:“orange”,“color”:“orange”,“size”: “medium”},{“name”:“strawberry”,“color”:“red”,“size”:“small”}]}
起初我想把它们加载到字典中并尝试更新:
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)
由于这两个字典都有一个“水果”条目,我希望它们会合并,但它简单地用dictb中的条目覆盖了条目中的条目。
我意识到我可以编写代码来遍历这个例子,但我使用的实际文件要大得多,也要复杂得多。我想知道是否有一个图书馆在我重新发明轮子之前已经做过类似的事情了。对于它的价值,我使用的是Python 2.6.2。
感谢您提出任何意见或建议!
答案 0 :(得分: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'}]}
答案 1 :(得分:0)
在列表parsed_json
中给出解析的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+的词典理解来做到这一点,但是你说2.6.2。鉴于您的声明,在现实世界中,您正在合并多个字段,您可以在将transformed_data
成员设置为您想要的任何字段时更改密钥。如果您不关心销毁原始解析数据,也可以删除copy
。