如何用simplejson正确解析JSON?

时间:2011-10-27 18:04:45

标签: python json simplejson

我可以使用以下JSON字符串:

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ],
      [ { "cid" : "1",
          "name" : "Something"
        } ],
      [ { "cid" : 1,
          "name" : "Something-else"
        } ]
    ] }

或以下之一:

{"error":"some-error"}

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ],
      [ { "cid" : "1",
          "name" : ""
        } ],
      [ { "cid" : 1,
          "name" : "Something-else"
        } ]
    ] }

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ] ] }

所以,我不确定所有的孩子和元素是否存在。是否足以进行以下验证以获得Something值:

if jsonstr.get('response'):
    jsonstr = jsonstr.get('response')[1][0]
    if jsonstr:
        name = jsonstr.get('name')
        if jsonstr: # I don't need empty value
            # save in the database

可以简化吗?

1 个答案:

答案 0 :(得分:2)

您无法保证每次解析内部对象的顺序都是相同的,因此在name属性设置为{的情况下引用对象的索引并不安全。 {1}}。

您可以使用list comprehension,而不是嵌套所有Something语句。请注意,如果您迭代if键,您将获得一个列表列表,每个列表都包含一个字典:

response

如果您索引每个列表中的第一项(>>> data = {"response":[[{"uid":123456,"name":"LA_"}],[{"cid":"1","name":"Something"}],[{"cid":1,"name":"Something-else"}]]} >>> [lst for lst in data.get('response')] [[{'name': 'LA_', 'uid': 123456}], [{'name': 'Something', 'cid': '1'}], [{'name': 'Something-else', 'cid': 1}]] ),您最终会得到一个对象列表:

lst[0]

如果您在列表推导中添加>>> [lst[0] for lst in data.get('response')] [{'name': 'LA_', 'uid': 123456}, {'name': 'Something', 'cid': '1'}, {'name': 'Something-else', 'cid': 1}] 条件以匹配对象上的if属性,则会得到一个包含所需对象的单个项目的列表:

name

然后通过索引最终列表的第一个项目,您将获得所需的对象:

>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something']
[{'name': 'Something', 'cid': '1'}]

那么你就可以把它变成一个功能,继续你的生活:

>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something'][0]
{'name': 'Something', 'cid': '1'}

如果找不到def get_obj_by_name(data, name): objects = [lst[0] for lst in data.get('response', []) if lst[0].get('name') == name] if objects: return objects[0] return None print get_obj_by_name(data, 'Something') # => {'name': 'Something', 'cid': '1'} print get_obj_by_name(data, 'Something')['name'] # => 'Something' 密钥,它应具有弹性并返回None

response