1

我可以有以下 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

同样可以简化吗?

4

1 回答 1

2

您不能保证每次解析时内部对象的顺序都是相同的,因此索引不是一个安全的选择来引用name属性设置为的对象的索引Something

不用嵌套所有这些if语句,您可以使用list comprehension。请注意,如果您迭代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找不到密钥,它应该是有弹性的并返回:

print get_obj_by_name({"error":"some-error"}, 'Something')
# => None
于 2011-10-27T19:00:27.353 回答