为了账号安全,请及时绑定邮箱和手机立即绑定

在python中获取json/dictionary中的所有关键路径组合

在python中获取json/dictionary中的所有关键路径组合

一只名叫tom的猫 2021-12-21 11:07:34
我希望能够在 JSON 文件中获取所有各种键的路径。我经常获得大型 JSON,但我不确定各种数据元素可能在哪里。或者我需要查询数据的各种元素。可视化 JSON 树可能不方便。基本上,我想获得所有不同路径的列表,以使未来的各种任务更容易。例如:myjson = {'transportation':'car','address': {'driveway':'yes','home_address':{'state':'TX','city':'Houston'}}, 'work_address':{'state':'TX','city':'Sugarland', 'location':'office-tower', 'salary':30000}}如果我可以运行某种类型的循环来以下面的这种格式或某种格式返回列表,那就太好了。myjson['地址']['车道']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。工作地址.state例如我已经开始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+ 层深?
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

很棒的片段!


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


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


查看完整回答
反对 回复 2021-12-21
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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


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)

输出:


['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()从函数内部递归调用!


查看完整回答
反对 回复 2021-12-21
?
函数式编程

TA贡献1807条经验 获得超9个赞

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


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]


查看完整回答
反对 回复 2021-12-21
  • 3 回答
  • 0 关注
  • 295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信