Python JSON在嵌套字典中获取密钥路径

Python JSON在嵌套字典中获取密钥路径,python,json,dictionary,Python,Json,Dictionary,这是我的json字符串,它经常变化,所以字典中的键位置每次都不一样,我需要 搜索一个键并打印相应的值,因为每次我编写递归函数(见下文)进行搜索时,json字符串都会更改 for输入新的json字符串并打印值。但是现在的情况是,我们多次使用相同的键和diff值,如何才能 我得到了键的完整路径,因此更容易理解它是哪个键值,例如,结果应该如下所示: json = '{ "app": { "Garden": { "Flowers": {

这是我的json字符串,它经常变化,所以字典中的键位置每次都不一样,我需要 搜索一个键并打印相应的值,因为每次我编写递归函数(见下文)进行搜索时,json字符串都会更改 for输入新的json字符串并打印值。但是现在的情况是,我们多次使用相同的键和diff值,如何才能 我得到了键的完整路径,因此更容易理解它是哪个键值,例如,结果应该如下所示:

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"
            }
        }
    }'
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)
到目前为止我的代码:

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

可以添加跟踪当前JSON路径的字符串参数。类似以下的方法可能会起作用:

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)
你可以这样称呼它:

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"
            }
        }
    }'
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)

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

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
用法:

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

谢谢…不过这是一个递归函数,最后一个都不返回..我们能修复它吗?从这样一个函数返回多个东西会很棘手。一个更简单的方法是有一个你传入的列表,就像我在这个编辑版本中添加的那样,它收集所有的最终路径。调用函数后,
所有_路径
将包含所有打印的数据。第7行,在find path=path+element+'='+JSON[element]中。encode('utf8')UnicodeDecodeError:'ascii'编解码器无法解码位置3中的字节0xc3:序号不在范围内(128),这是另一个问题。如果您无法找出问题所在,请使用您知道的所有信息单独提问。单独发布此问题,无法调试此问题在值中出现特殊字符的原因。