2012-11-28 52 views

回答

2

你必須直到找到一個匹配的JSON結構,遍歷所有的字典解碼:

for person in json.loads(user_stream): 
    if person['name'] == user: 
     id = person['id'] 
     break 
else: 
    # The else branch is only ever reached if no match was found 
    raise ValueError('No such person') 

如果您需要進行多次查找,您可能需要將此結構轉換爲dict以便於查找:

name_to_id = {p['name']: p['id'] for p in json.loads(user_stream)} 

然後擡頭看id直接:

id = name_to_id.get(name) # if name is not found, id will be None 

上面的例子假設名稱是獨一無二的,如果他們都沒有,使用:

from collections import defaultdict 

name_to_id = defaultdict(list) 
for person in json.loads(user_stream): 
    name_to_id[person['name']).append(person['id']) 

# lookup 
ids = name_to_id.get(name, []) # list of ids, defaults to empty 

這是一如既往的權衡,你交易記憶的速度。

+0

有沒有辦法做到這一點不循環?我無法「搜索」PersonA? – sharataka

+0

@sharataka:不能以所有JSON格式變體的方式工作,不會。 –

+0

謝謝,儘管所有的JSON格式變體是什麼意思? – sharataka

1

Martijn Pieters的解決方案是正確的,但如果你打算做很多這樣的查找,最好加載json並迭代一次,而不是每次查找。

name_id = {} 

for person in json.loads(user_stream): 
    name = person['name'] 
    id = person['id'] 
    name_id[name] = id 

user = 'PersonA' 
print name_id[user] 
+1

+1。如果您的數據不具有適合您預期用途的結構,那麼一個好的做法是首先重構數據,然後使用它。 – heltonbiker

0
persons = json.loads(...) 
results = filter(lambda p:p['name'] == 'avi',persons) 
if results: 
    id = results[0]["id"] 

results可超過1療程..