2011-10-27 40 views
1

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

可以在同一被简化?

回答

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 
+0

谢谢,@jathan主义,如此详细的答案。其实,'东西'是我正在寻找的价值 - 它可以是任何其他价值。第三方并没有给我提供这个元素的任何标识符,所以我必须依赖他们的顺序。 –

+0

不客气。 :) – jathanism