2012-12-20 55 views
1

我有Python代碼以下塊:在Python中解析JSON:格式更改後如何讓has_key()再次工作?

data = json.loads(line) 
if data.has_key('derivedFrom'): 
    dFin = data['derivedFrom'] 
    if dFin.has_key('derivedIds'): 

這用於JSON的這樣一個塊做工精細:

"derivedFrom": {"source": "FOO", "model": "BAR", "derivedIds": ["123456"]} 

現在的格式更改爲:

"derivedFrom": "{\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"] 

因此Python塊中的最後一行會引發以下異常:

'unicode' object has no attribute 'has_key' 

有沒有辦法預處理JSON使has_key重新工作?

+1

格式如何變化?另外,該塊不是有效的JSON。 – Blender

+2

「更改」格式不是有效的JSON。它根本不會解析。 –

+4

而且'foo.has_key(bar)'至少在Python 2.4中已經被拼寫成'bar in foo'。 –

回答

5
"{\"source\": \"FOO.\", \"model\": ... 

是JSON字符串文字中的JSON對象。要了解內部JSON的屬性,您必須再次解碼它。

data = json.loads(line) 
if 'derivedFrom' in data: 
    dFin = json.loads(data['derivedFrom']) 
    if 'derivedIds' in dFin: 
     .... 

JSON-in-JSON通常是一個錯誤,因爲它很少需要它 - 什麼是產生這個輸出,它需要修復嗎?

0

您正在將derivedFrom屬性從JSON對象更改爲字符串。字符串沒有名爲has_key的屬性。

1

用途:

'derivedIds' in dFin 

這適用於字典和unicode的,即使使用Unicode它可能產生假陽性。

更爲強硬的手段可以使用Duck Typing

try: 
    dFin = json.loads(data['derivedFrom']) #assume new format 
except TypeError: 
    dFin = data['derivedFrom'] #it's already a dict 
if 'derivedIds' in dFin: # or dFin.has_key('derivedIds') 
    #etc 
0

如果你想要的代碼完全相同的塊工作,考慮新的格式稍有調整到如下:

"{\"derivedFrom\": {\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"]}}"