Как использовать путь списка получить значение JSON - PullRequest
1 голос
/ 13 июня 2019

Привет всем, у меня есть текст 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 son

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

Python предоставляет модуль json, который может считывать файл JSON в структуру данных python dict:

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)
1 голос
/ 13 июня 2019

Я рекомендую вам использовать библиотеку json.https://www.w3schools.com/python/python_json.asp Вы можете использовать json.loads, который преобразует json в dict, и вы можете получить доступ к значению с помощью dict_name[key]

Попробуйте найти библиотеку перед написанием функции.

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