【问题标题】:How to update json file with values from the other json file?如何使用其他 json 文件中的值更新 json 文件?
【发布时间】:2018-05-15 19:02:40
【问题描述】:

我有两个 json 文件:config.jsonupdate.json。如何根据update.json中的值更新现有的config.json文件? update.json 中的 key:value 将不包含父密钥信息并假定所有密钥都是唯一的。有没有办法在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"
                }
            }
        }
    }
}

【问题讨论】:

  • 请向我们展示您到目前为止所做的尝试

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


【解决方案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)

【讨论】:

    【解决方案2】:

    最简单的方法是使用递归函数来实现:

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

    【讨论】:

    • 你能展示如何在 kotlin 或 java 中为 android 执行此操作吗?
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2021-08-17
    • 2022-01-19
    • 2020-10-16
    相关资源
    最近更新 更多