使用标准的json库我必须获取与此类似的json字符串中的key的值,而且json字符串中的键位置没有固定,并且它可能位于某个多个json对象下,所以我将如何导航到整个json字符串并查找获取相应值的键
{
"app": {
"GardenCategory": {
"label": {
"Flower": "Rose",
"Fruits": "Apple"
}
},
"Flowers": {
"Red_Flowers": "Rose",
"Thorn_Flowers": "Marigold",
"beautiful_flower": "sunflower",
},
"FruitState": {
"label": {
"Sweet Fruit": "Mango",
"Healthy fruits": "Orange",
"Liquid fruits": "Water-Melon",
}
}
}
答案 0 :(得分:1)
首先,您的json格式不正确。你需要在"beautiful_flower": "sunflower",
和"Liquid fruits": "Water-Melon",
之后删除逗号,你也错过了字符串末尾的括号。
你需要做的下一件事,如果你把它作为一个字符串,将它变成python中的一个字典。你可以这样做:
import json
a='{"app": {"GardenCategory": {"label": {"Flower": "Rose","Fruits": "Apple"}},"Flowers": {"Red_Flowers": "Rose","Thorn_Flowers": "Marigold","beautiful_flower": "sunflower"},"FruitState": {"label": {"Sweet Fruit": "Mango","Healthy fruits": "Orange","Liquid fruits": "Water-Melon"}}}}'
j=json.loads(a)
然后,您可以尝试使用方法递归地找到所需的元素:
def find(element, JSON):
if element in JSON:
return JSON[element]
for key in JSON:
if isinstance(JSON[key], dict):
return find(element, JSON[key])
这将查看第一级键,并检查您想要的键是否在第一级。如果是,它将返回该值。如果它不在第一级,它将循环遍历所有键并运行查找所有也是字典的值。它将返回它找到的第一个匹配的值。例如:
find('Sweet Fruit', j)
将返回Mango
find('label', j)
将返回{'Fruits': 'Apple', 'Flower': 'Rose'}
如果您要查找的内容不在字典中,则不会返回
find('foobar', j)
将返回None
答案 1 :(得分:1)
如评论json.load()
中所述,将为您提供字典。您只需要在需要时递归遍历该字典,以找到所需的密钥。
我的这个功能的初稿是:
def find(adict, key):
if key in adict.keys():
return adict[key]
else:
for ndict in adict.values():
return find(ndict, key)
In [466]: adict={'a':{"b":3, "c":{"d":4}}}
In [467]: find(adict,'d')
Out[467]: 4
In [468]: find(adict,'e')
...
AttributeError: 'int' object has no attribute 'keys'
由于json
字符串也可以包含列表,因此该函数也应该处理这些列表。
纠正你得到的例子:
In [477]: adict=json.loads(txt)
In [478]: find(adict,'Flower')
Out[478]: u'Rose'
更强大的版本:
def find1(adict, key):
if isinstance(adict, dict):
if key in adict.keys():
return adict[key]
for ndict in adict.values():
x = find1(ndict, key)
if x: return x
else:
return None