python获取json密钥作为完整路径

2024-03-28 16:59:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想解析一个JSON文件并获得包含所有访问键所需路径的完整列表。如果我们使用keys方法,我们得到的是单个键的列表,而不是访问数据所需的层次键的完整列表。在

所以如果给定的数据是这样的

data = {
    "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"
                }
            }
        }
    }
}

我可以返回一个如下所示的列表,其中包含所有键的完整路径。在

^{pr2}$

读取和访问元素是可以的。为了得到结果,我试着用这个来回答Access nested dictionary items via a list of keys

我真的不明白它是如何工作的,它只返回单词“glossary”。在

这是我的密码。我使用的是ChainMap,因为它可以更容易地将json转换为字典,并且可以轻松地访问键。在

import json
from collections import ChainMap
from functools import reduce
import operator

myDataChained = ChainMap(data)

def getFromDict(data):
    return reduce(operator.getitem, data)

Json_Paths = getFromDict(myDataChained)
print(Json_Paths)

Tags: 数据fromimport路径jsonreduce列表data
1条回答
网友
1楼 · 发布于 2024-03-28 16:59:16

您不能使用与链接答案中相同的方法来执行相反的操作-您没有预先遍历functools.reduce()/operator.getitem()组合的路径信息-而是尝试获取该信息,即规范化/扁平化字典结构。在

为此,您必须遍历整个结构并收集数据中所有可能的路径,例如:

import collections

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):
        #                          Python 2.x: use basestring instead of 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

现在,如果你运行你的data通过它:

^{pr2}$

您将得到paths,其中包含:

[['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']]

您可以将其中任何一个输入到functools.reduce()/operator.getitem()组合框中以获得目标值。在

相关问题 更多 >