【问题标题】:how to use list path get json value如何使用列表路径获取json值
【发布时间】:2019-06-13 13:34:15
【问题描述】:

大家好,我下面有一个json文本

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...",
                    "GlossSeeAlso": ["GML", "XML"]
                },
                "GlossSee": "markup"
            }
        }
    }
}

}

我创建了一个可以获取json所有字段路径的函数。 如下:

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

现在您可以看到如下所示的所有路径:

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

如何遍历路径列表得到json的各个字段的值?

【问题讨论】:

  • 有一个json 内置库,您可以使用json.loads() 从文件或字符串变量中加载json。见reference here

标签: python json list


【解决方案1】:

Python提供了json模块,可以将JSON文件读入pythondict数据结构:

import json

with open("my_file.json", "r") as my_file:
    contents = json.loads(my_file.read())

之后,您可以将其视为dict

title = contents["glossary"]["title"]
glossDivTitle = contents["glossary"]["glossDiv"]["title"]
para = contents["glossary"]["glossDiv"]["glossList"]["glossEntry"]["glossDef"]["para"]
...

现在,假设您有一个这样的列表,您在问题中创建了它:

lk = ['glossary', 'GlossDiv', 'GlossList', 'GlossEntry', 'Acronym']

这是一个可用于检索相关值的函数:

def retrieve_value(key_list, dct):
    subdict = dct
    for k in key_list:
        subdict = subdict[k]
    return subdict

retrieve_value(lk, contents)

【讨论】:

  • 如果您正在打开一个物理文件,使用contents = json.load(my_file) 可能更简单......但结果相同。
  • 嗨,谢谢你的评论,但有些东西不是我想要的,当前问题我得到 json 字段路径标题 A = ['glossary', 'GlossDiv', 'title'] 我怎么能得到倾斜来自数据[A[0]][A[1]][A[2]]?
  • @andylei 我已经编辑了我的答案,以包含有关如何从问题底部包含的列表中获取信息的部分
  • 嗨,Green Cloak Guy,兄弟,我找到你了,非常感谢:)
  • 嗨兄弟,如果我使用lk路径更新内容怎么办?示例使用 lk update content set only Acronym value changed?
【解决方案2】:

我推荐你使用 json 库。 https://www.w3schools.com/python/python_json.asp 您可以使用 json.loads 将 json 转换为 dict 并且您可以通过 dict_name[key] 访问值

在编写函数之前尝试找到一个库。

【讨论】:

  • 嗨 simone 谢谢你评论我的问题不清楚,当前问题我得到 json 字段路径标题 A = ['glossary', 'GlossDiv', 'title'] 我怎么能得到数据[A[0]][A[1]][A[2]]的倾斜值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多