Python JSON在嵌套字典中获取密钥路径
这是我的json字符串,它经常变化,所以字典中的键位置每次都不一样,我需要 搜索一个键并打印相应的值,因为每次我编写递归函数(见下文)进行搜索时,json字符串都会更改 for输入新的json字符串并打印值。但是现在的情况是,我们多次使用相同的键和diff值,如何才能 我得到了键的完整路径,因此更容易理解它是哪个键值,例如,结果应该如下所示:Python JSON在嵌套字典中获取密钥路径,python,json,dictionary,Python,Json,Dictionary,这是我的json字符串,它经常变化,所以字典中的键位置每次都不一样,我需要 搜索一个键并打印相应的值,因为每次我编写递归函数(见下文)进行搜索时,json字符串都会更改 for输入新的json字符串并打印值。但是现在的情况是,我们多次使用相同的键和diff值,如何才能 我得到了键的完整路径,因此更容易理解它是哪个键值,例如,结果应该如下所示: json = '{ "app": { "Garden": { "Flowers": {
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),这是另一个问题。如果您无法找出问题所在,请使用您知道的所有信息单独提问。单独发布此问题,无法调试此问题在值中出现特殊字符的原因。