Как обновить файл JSON со значениями из другого файла JSON? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть два файла 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"
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Предполагая, что вы знаете, как загружать 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)
0 голосов
/ 15 мая 2018

Самым простым способом было бы реализовать это с помощью рекурсивной функции:

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 и отображением обновления, и вы получите результат, который вы предоставите в своем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...