首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中获取json/字典中的所有键路径组合

在python中获取json/字典中的所有键路径组合
EN

Stack Overflow用户
提问于 2019-03-29 05:25:52
回答 3查看 557关注 0票数 0

我希望能够在JSON文件中获得密钥的所有不同路径。我经常获得大的JSON,并且我不能确切地确定各种数据元素可能在哪里。或者我需要查询数据的各种元素。可视化JSON的树可能很不方便。

基本上,我希望获得所有不同路径的列表,以使未来的各种任务变得更容易。

例如:

代码语言:javascript
复制
myjson = {'transportation':'car',
'address': {'driveway':'yes','home_address':{'state':'TX',
'city':'Houston'}},
 'work_address':{
'state':'TX',
'city':'Sugarland',
 'location':'office-tower',
 'salary':30000}}

如果我可以运行某种类型的循环来获得下面这种格式或某种格式的列表,那就太好了……

myjson‘’address‘

myjson.address myjson.address.driveway myjson.address.home_address myjson.address.home_address.city myjson.address.home_address.state myjson.transportation myjson.work_address myjson.work_address.city myjson.work_address.location myjson.work_address.salary myjson.work_address.state

举个例子,我从

代码语言:javascript
复制
mylist = []

for  key, value in myjson.items():
    mylist.append(key)
    if type(value) is dict:
        for key2, value2 in myjson[key].items():
        mylist.append(key+'.'+key2)
print(mylist)

我猜这有点用,但我不知道如何让它无限期地迭代。例如,如何将其构建为3-10+层深?

EN

回答 3

Stack Overflow用户

发布于 2019-09-30 00:35:18

很棒的片段!

这是一个管理列表的版本:

代码语言:javascript
复制
def get_keys(some_dictionary, parent=None):
    if isinstance(some_dictionary, str):
        return
    for key, value in some_dictionary.items():
        if '{}.{}'.format(parent, key) not in my_list:
            my_list.append('{}.{}'.format(parent, key))
        if isinstance(value, dict):
            get_keys(value, parent='{}.{}'.format(parent, key))
        if isinstance(value, list):
            for v in value:
                get_keys(v, parent='{}.{}'.format(parent, key))
        else:
            pass
票数 1
EN

Stack Overflow用户

发布于 2019-03-29 06:38:11

我认为这应该能满足您的要求:

代码语言:javascript
复制
myjson = {
    'transportation': 'car',
    'address': {
        'driveway': 'yes',
        'home_address': {
            'state': 'TX',
            'city': 'Houston'}
    },
    'work_address': {
        'state': 'TX',
        'city': 'Sugarland',
        'location': 'office-tower',
        'salary': 30000}
}


def get_keys(some_dictionary, parent=None):
    for key, value in some_dictionary.items():
        if '{}.{}'.format(parent, key) not in my_list:
            my_list.append('{}.{}'.format(parent, key))
        if isinstance(value, dict):
            get_keys(value, parent='{}.{}'.format(parent, key))
        else:
            pass


my_list = []
get_keys(myjson, parent='myjson')
print(my_list)

输出:

代码语言:javascript
复制
['myjson.transportation',
'myjson.work_address',
'myjson.work_address.city',
'myjson.work_address.state',
'myjson.work_address.location',
'myjson.work_address.salary',
'myjson.address',
'myjson.address.driveway',
'myjson.address.home_address',
'myjson.address.home_address.city',
'myjson.address.home_address.state']

关键是从函数内部递归地调用get_keys()

票数 0
EN

Stack Overflow用户

发布于 2021-01-12 09:52:32

一种在json中处理列表路径的实现。

代码语言:javascript
复制
import json
def get_json_key_path(jsonStr, enable_index):
    json_keys = []
    jsonObj = json.loads(jsonStr)
    
    def get_key_path(jsonObj, parent=None):
        if not isinstance(json_obj, dict):
            return
        for key, value in jsonObj.items():
            if not isinstance(value, list) and '{}.{}'.format(parent, key) not in json_keys:
                json_keys.append('{}.{}'.format(parent, key))
            if isinstance(value, dict):
                get_key_path(value, parent='{}.{}'.format(parent, key))
            elif isinstance(value, list):
                i = 0
                for obj in value:
                    if enable_index:
                        get_key_path(obj, parent='{}.{}.{}'.format(parent, key, i))
                    else:
                        get_key_path(obj, parent='{}.{}'.format(parent, key))
                    i = i + 1
            else:
                pass

    get_key_path(jsonObj, "")
    return [ s[1:] for s in json_keys]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55407075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档