我有两个json文件:config.json
和update.json
。如何根据config.json
中的值更新现有的update.json
文件? key:value
中的update.json
将不包含父密钥信息,并假设所有密钥都是唯一的。有没有办法在python中实现它?
config.json
:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
update.json
:
{"ID": "ABC",
"GlossSeeAlso": ["ABC", "DEF"]
}
python的输出应该是这样的:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "ABC",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["ABC", "DEF"]
},
"GlossSee": "markup"
}
}
}
}
}
答案 0 :(得分:1)
假设您知道如何加载json
个文件,您只需递归修改字典:
def update_dict(d, key, new_value):
for k, v in d.items():
if k == key:
d[k] = new_value
return True
elif isinstance(v, dict):
if update_dict(v, key, new_value):
return True
return False
这将修改原始字典,如果您不想这样,请使用@scnerd解决方案。
然后您可以像这样使用它,其中config是字典,用于修改和更新字典以及要更改的值:
for k, v in update.items():
update_dict(config, k, v)
答案 1 :(得分:0)
最简单的方法是使用递归函数实现它:
def update(base, new):
if isinstance(base, dict):
for k, v in new.items():
if k in base:
base[k] = v
return {k: update(v, new) for k, v in base.items()}
else:
return base
只需使用您的初始JSON对象和更新映射调用它,您就可以获得您在问题中提供的输出。