【问题标题】:Parsing a json (a response from freebase) in python在python中解析一个json(来自freebase的响应)
【发布时间】:2014-10-20 10:43:12
【问题描述】:

在 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 中获取所有键值对的代码以及一些指出我的错误的解释。

【问题讨论】:

  • response["result"] 是一个字典列表(在你的情况下,只有一个字典)。
  • 我已经根据实际的嵌套结构重新格式化了你的 JSON,这应该会让你的错误更清楚。

标签: python json freebase


【解决方案1】:

你可以遍历字典的items,给你成对的键和值;然后,您可以过滤该值:

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 等效项)在布尔上下文中被认为是错误的,因此对于那些值为空列表的属性,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 有一个空值。

【讨论】:

  • 您对len(response) = 1 的假设是正确的,type(response)dict。我收到以下错误。 AttributeError: 'list' object has no attribute 'items'
  • @Hegde:啊,我错过了response['result'] 是一个列表,而不是一个字典的事实。已更新。
  • 效果很好。谢谢@Martin Pieters
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多