Python可以使用递归函数在不限层级的Json数据中查找某个key或value的路径,具体步骤如下:
- 定义递归函数,参数包括待查找的key或value、json数据、路径列表。
- 遍历json数据的每个key-value对。
- 若当前key或value与待查找的相等,则将当前key的路径加入路径列表中。
- 若当前value是一个字典,则递归调用函数,传入当前value作为新的json数据,paths作为新的路径列表。
- 若当前value是一个列表,则遍历列表,若元素是字典则递归调用函数,传入元素字典作为新的json数据,paths作为新的路径列表。
以下是两个示例:
对于以下json数据:
{
"name": "Alice",
"age": 22,
"pets": [
{
"name": "Charlie",
"type": "dog",
"age": 3,
"friends": [
{"name": "Lola", "type": "dog"},
{"name": "Max", "type": "cat"}
]
},
{
"name": "Lucy",
"type": "cat",
"age": 1,
"friends": [
{"name": "Charlie", "type": "dog"},
{"name": "Bella", "type": "cat"}
]
}
]
}
要找到所有宠物friends中type为“cat”的路径,可以使用以下代码实现:
def find_paths_by_value(val, data, paths):
if isinstance(data, dict):
for k, v in data.items():
if v == val:
paths.append(k)
elif isinstance(v, dict):
find_paths_by_value(val, v, [k] + paths)
elif isinstance(v, list):
for idx, item in enumerate(v):
if isinstance(item, dict):
find_paths_by_value(val, item, [k, idx] + paths)
paths = []
find_paths_by_value("cat", data, paths)
print(paths)
运行结果为:
[['pets', 0, 'friends', 1, 'type'], ['pets', 1, 'friends', 1, 'type']]
可以看到,该代码找到了两个路径,分别对应两只猫友。
对于以下json数据:
{
"path1": {
"path2": {
"path3": {
"path4": {
"key": "value"
}
}
}
}
}
要找到key为"value"的路径,可以使用以下代码实现:
def find_paths_by_key(key, data, paths):
if isinstance(data, dict):
for k, v in data.items():
if k == key:
paths.append([k])
elif isinstance(v, dict):
for subpath in find_paths_by_key(key, v, []):
paths.append([k] + subpath)
paths = []
find_paths_by_key("key", data, paths)
print(paths)
运行结果为:
[['path1', 'path2', 'path3', 'path4', 'key']]
可以看到,该代码找到了一个路径,对应key为"value"的位置。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python查找不限层级Json数据中某个key或者value的路径方式 - Python技术站