JSON获取嵌套字典中的关键路径

时间:2015-06-23 18:09:04

标签: python json dictionary

json = '{
    "app": {
        "Garden": {
            "Flowers": {
                "Red flower": "Rose",
                "White Flower": "Jasmine",
                "Yellow Flower": "Marigold"
            }
        },
        "Fruits": {
            "Yellow fruit": "Mango",
            "Green fruit": "Guava",
            "White Flower": "groovy"
        },
        "Trees": {
            "label": {
                "Yellow fruit": "Pumpkin",
                "White Flower": "Bogan"
            }
        }
    }'

这是我的json字符串,它不断变化,因此字典中的键位置每次都不一样,我需要 搜索一个键并打印出相应的值,因为每次我写了一个递归函数(见下文)时json字符串都会改变 对于新的json字符串中的键并打印该值。但是现在情况是我们有多次使用diff值的相同键,怎么可以 我得到了密钥的完整路径,因此更容易理解它是哪个键值,例如结果应该是这样的:

app.Garden.Flowers.white Flower = Jasmine
app.Fruits.White Flower = groovy
app.Trees.label.White Flower = Bogan

到目前为止我的代码:

import json
with open('data.json') as data_file:    
  j = json.load(data_file)

# j=json.loads(a)


def find(element, JSON):    
  if element in JSON:
    print JSON[element].encode('utf-8')
  for key in JSON:
    if isinstance(JSON[key], dict):
      find(element, JSON[key])



find(element to search,j)

3 个答案:

答案 0 :(得分:2)

您可以添加一个字符串参数来跟踪当前的JSON路径。像下面这样的东西可以工作:

def find(element, JSON, path, all_paths):    
  if element in JSON:
    path = path + element + ' = ' + JSON[element].encode('utf-8')
    print path
    all_paths.append(path)
  for key in JSON:
    if isinstance(JSON[key], dict):
      find(element, JSON[key],path + key + '.',all_paths)

你会这样称呼:

all_paths = []
find(element_to_search,j,'',all_paths)

答案 1 :(得分:0)

def getDictValueFromPath(listKeys, jsonData):
    """
    >>> mydict = {
        'a': {
            'b': {
                'c': '1'
            }
        }
    }
    >>> mykeys = ['a', 'b']
    >>> getDictValueFromPath(mykeys, mydict)
    {'c': '1'}
    """
    localData = jsonData.copy()
    for k in listKeys:
        try:
            localData = localData[k]
        except:
            return None
return localData

gist

答案 2 :(得分:0)

这是Brian答案的修改版本,它支持列表并返回结果:

def find(element, JSON, path='', all_paths=None):
    all_paths = [] if all_paths is None else all_paths
    if isinstance(JSON, dict):
        for key, value in JSON.items():
            find(element, value, '{}["{}"]'.format(path, key), all_paths)
    elif isinstance(JSON, list):
        for index, value in enumerate(JSON):
            find(element, value, '{}[{}]'.format(path, index), all_paths)
    else:
        if JSON == element:
            all_paths.append(path)
    return all_paths

用法:

find(JSON, element)