在python中解析json(来自freebase的响应)

时间:2014-10-20 10:43:12

标签: python json freebase

在python中解析json(来自freebase的响应) 这个问题与JSON解析有关。我正在查询freebase以获取一些数据并获取JSON个对象。响应具有以下结构

{
  "result": [
    {
      "attribute0": [
        "attrbVal0"
      ],
      "attribute1": [],
      "attribute2": "attrbVal1",
      "attribute3": [
        "val1",
        "val2"
      ],
      "creator": "abc",
      "key": [
        "val2",
        "val3"
      ]
    }
  ]
}

请注意,属性对任意数量的值都可以为零。没有值时,它表示为[]或null。 我不知道这组属性。它会随着查询的变化而变化,因此我无法对像

这样的值进行硬编码
result['attribute2'];

从上面的JSON我想获得值为[]null的属性。 我尝试过以下方法来获取属性和值,

print response.keys()

打印结果

for r in response['result']: 
    print r

这样可以一次性打印结果中的所有内容。那是

print len(result) #prints 1

我已尝试以下方法获取属性列表,但没有运气。

result = response['result']
elem = json.loads(result);
keys = elem.keys()

所以我正在寻找代码来从上面的json中获取所有键值对,并且一些解释指出了我的错误。

1 个答案:

答案 0 :(得分:2)

您可以循环遍历字典的,同时为您提供键和值;然后,您可以过滤值:

for result in response['result']:
    for attrname, value in result.items():
        if not value:  # empty list or None
            print attrname

请注意response['result']是一个列表,包含(可能)一个或多个字典对象。

在Python中,空列表和None(相当于JSON null的Python)在布尔上下文中被视为false,因此not valueTrue其值在原始JSON响应中为空列表或null的属性。

演示:

>>> response = {
...   "result": [
...     {
...       "attribute0": [
...         "attrbVal0"
...       ],
...       "attribute1": [],
...       "attribute2": "attrbVal1",
...       "attribute3": [
...         "val1",
...         "val2"
...       ],
...       "creator": "abc",
...       "key": [
...         "val2",
...         "val3"
...       ]
...     }
...   ]
... }
>>> for result in response['result']:
...     for attrname, value in result.items():
...         if not value:  # empty list or None
...             print attrname
... 
attribute1

因此,在您的示例输入中,只有attribute1具有空值。