猿问

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

我希望能够在 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+ 层深?


一只名叫tom的猫
浏览 296回答 3
3回答

繁星淼淼

很棒的片段!这是一个管理列表的版本: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

Smart猫小萌

我认为这应该满足您的要求: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:            passmy_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()从函数内部递归调用!

函数式编程

也在 json 中处理列表路径的实现。import jsondef 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]
随时随地看视频慕课网APP

相关分类

Python
我要回答