2012-11-21 22 views
0

我需要閱讀,有一個名爲「衍生自」鍵JSON消息。它的值可能有兩種形式如下:讀取JSON字典在python:如何處理長度爲1的數組?

Case 1. "derivedFrom": "id1" 

或本:

Case 2. "derivedFrom": ["id1", "id2", "id3"] 

我需要做的是一件很簡單:讀取的值(一個或多個)和環路他們。現在我這樣做:

#line contains JSON string 
data = json.loads(line) 
# ... 
derivedIds = data['derivedFrom'] 
for deid in derivedIds: 
# ... 

也能正常工作情況2,但對於案例1它循環在ID「ID1」,這顯然不是我所需要的單個字符。

如何修改上面的塊正確地處理這兩種情況? THX

回答

1

如果你知道衍生自的值將始終是列表或一個值(即,不是一個字典):

#line contains JSON string 
data = json.loads(line) 
# ... 
derivedIds = data['derivedFrom'] 
if not isinstance(derivedIds, list): 
    derivedIds = [derivedIds] 
for deid in derivedIds: 

,它的從JSON來的事實簡化問題,因爲它極大地限制你不必擔心數據類型的數量。

0

您可以用這一事實播放str/unicode沒有一個__iter__屬性,而listssetsdicts做。

#!/usr/bin/env python 

import json 

case1 = '{"derivedFrom": "id1"}' 

case2 = '{"derivedFrom": ["id1", "id2", "id3"]}' 

def parse(line): 
    data = json.loads(line) 
    if not(hasattr(data["derivedFrom"], "__iter__")): 
     print "Converting %s to list" % type(data["derivedFrom"]) 
     data["derivedFrom"] = [data["derivedFrom"]] 
    print "data['derivedFrom']: %s, of type %s" % (data["derivedFrom"], type(data["derivedFrom"])) 

if __name__ == "__main__": 
    parse(case1) 
    parse(case2) 

雖然,如果可能的話,我寧願修改任何正在發送JSON,以確保在發送列表(要把它送'{"derivedFrom": ["id1"]}'

0

作爲原始例如:

#line contains JSON string 
data = json.loads(line) 
# ... 
derivedIds = data['derivedFrom'] 
if isinstance(derivedIds, basestring): 
    #.... 
else: 
    for deid in derivedIds: 
    # ...