如何使用其他json文件中的值更新json文件?

时间:2018-05-15 19:02:41

标签: python json python-3.x python-requests

我有两个json文件:config.jsonupdate.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"
                }
            }
        }
    }
}

2 个答案:

答案 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对象和更新映射调用它,您就可以获得您在问题中提供的输出。