Python - Return 匹配字符串的所有 JSON 元素的路径

Python - Return path of all JSON elements that match string

我试图从逻辑上遍历 Python 中的 JSON 和 return 等于某个值的任何字符串值的路径。我试图递归遍历它,但如果多个元素匹配比较,它只会 returns 他第一个:

test_json = {
    "a": {
        "b": {
            "c": {
                "d": "foo"
            }
        }
    },
    "1": {
        "2": {
            "3": "bar"
        }
    },
    "a1" : "foo"
}

def searchDict(d, path):
    for k,v in d.iteritems():
        if isinstance(v, dict):
            path.append(k)
            return searchDict(v, path)
        else:
            if v == "foo":
                path.append(k)
                path.append(v)
                return path

print searchDict(test_json, [])

我希望它能够 return 类似于:

a -> b -> c -> d -> foo
a1 -> foo

但是它只遍历第一个子词典:

['a', 'b', 'c', 'd', 'foo']

这可能比我做的要容易,只是在逻辑上无法解决它。有什么想法吗?

一些观察,也许还有提示:

  1. 您希望您的算法打印所有路径,但您只保留一个列表。因此,您将所有路径添加到同一数据结构中。听起来更像是你想要一个列表列表,也许还有一个你传递的额外列表变量。您的选择
  2. 你在一个有点奇怪的地方打破了循环"return searchDict(v, path)"如果有更多的路径需要探索,你会在这里错过它们。如果您删除关键字 return,代码的行为将有所不同,我认为您可以从那里解决它。

祝你好运!

好问题。其实离自己解决还差一点点。

  1. 附加到路径变量将导致在所有递归调用中使用相同的变量。使用 path + [k] 将解决这个问题。如果很难尝试使用您的代码并在 searchdict 函数的开头打印出路径
  2. 您正确地使用 for 循环遍历 json 文件。但是,您也将返回到 forcycle 内部,这将停止它并且不会探索其他可能性。打印出结果,将其添加到结果字段或使用 python 的生成器来获取结果

查看我修改后的工作代码。尝试对您的代码进行尽可能少的更改,以便于理解。

test_json = {
    "a": {
        "b": {
            "c": {
                "d": "foo"
            }
        }
    },
    "1": {
        "2": {
            "3": "bar"
        }
    },
    "a1" : "foo"
}

def searchDict(d, path):
    for k,v in d.iteritems():
        if isinstance(v, dict):
            searchDict(v, path + [k])
        else:
            if v == "foo":
                print(path + [k] + [v])


searchDict(test_json, [])