2011-10-27 83 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