python中的json解析器

时间:2015-06-16 18:01:41

标签: python arrays json

使用标准的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",
            }
        }
}

2 个答案:

答案 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