如何动态获取json路径并使用该路径修改json字段值 [英] How to dynamically get the json path and modify the json field value with the path

查看:431
本文介绍了如何动态获取json路径并使用该路径修改json字段值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有很多json文件,它们的结构不同.我每次都需要更改json中一个字段的值,其他字段的值保持不变.

I have a lot of json files, their structure is different. I need to change the value of a field in json every time, the values of other fields remain unchanged.

现在,我已经能够按如下方式动态获取json的路径代码

Now I have been able to dynamically get the path code of json as follows

def get_paths(source):
    paths = []
    if isinstance(source, collections.MutableMapping):  # found a dict-like structure...
        for k, v in source.items():  # iterate over it; Python 2.x: source.iteritems()
            paths.append([k])  # add the current child path
            paths += [[k] + x for x in get_paths(v)]  # get sub-paths, extend with the current
    # else, check if a list-like structure, remove if you don't want list paths included
    elif isinstance(source, collections.Sequence) and not isinstance(source, str):
        for i, v in enumerate(source):
            paths.append([i])
            paths += [[i] + x for x in get_paths(v)]  # get sub-paths, extend with the current
    return paths

其中一个json示例如下,它只是许多json之一:

One of the json examples is as follows, it is just one of many 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...",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

使用以下代码获取路径

def loadJson():
    try:
        with open('../json/test1.json', 'r') as loadf:
            load_dict = json.load(loadf)
            return load_dict
    except Exception as e:
        raise Exception("load json fail")

t_json = loadJson()
paths = get_paths(loadJson())

此示例中的路径如下:

[['glossary'],
 ['glossary', 'title'],
 ['glossary', 'GlossDiv'],
 ['glossary', 'GlossDiv', 'title'],
 ['glossary', 'GlossDiv', 'GlossList'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'ID'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'SortAs'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossTerm'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'Acronym'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'Abbrev'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossDef'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossDef', 'para'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossDef', 'GlossSeeAlso'],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossDef', 'GlossSeeAlso', 0],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossDef', 'GlossSeeAlso', 1],
 ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'GlossSee']]

现在的问题是如何通过获取的路径动态修改字段之一的值?

The question now is how to dynamically modify the value of one of the fields by the path obtained?

示例:我想将"title": "S"修改为"title": "M".

如何使用['glossary', 'GlossDiv', 'title']来做到这一点?

How to use ['glossary', 'GlossDiv', 'title'] to do it?

for path in paths:
   # How to get t_json[path[0]][path[1]][path[2]]?

推荐答案

如何获取t_json[path[0]][path[1]][path[2]]?

简单:我们只需要遍历path,一次应用一次索引操作.这要求我们记住每个步骤之后的进度,最简单的方法是只重用跟踪其路径的变量.因此,例如:

Simple: we just need to iterate over path, applying one indexing operation at a time. This requires that we remember our progress after each step, and the simplest way is to just reuse a variable that traces its way through the path. Thus, for example:

element = t_json
for path_item in path:
    element = element[path_item]

这篇关于如何动态获取json路径并使用该路径修改json字段值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆