2013-05-10 138 views
8

我在使用python解析JSON時遇到問題,現在我卡住了。
問題是我的JSON的實體並不總是相同的。 JSON的是一樣的東西:使用python解析JSON:空白字段

"entries":[ 
{ 
"summary": "here is the sunnary", 
"extensions": { 
    "coordinates":"coords", 
    "address":"address", 
    "name":"name" 
    "telephone":"123123" 
    "url":"www.blablablah" 
}, 
} 
] 

我可以通過JSON移動,例如:

for entrie in entries: 
    name =entrie['extensions']['name'] 
    tel=entrie['extensions']['telephone'] 

來,因爲有時候,JSON沒有所有的「領域」,例如問題, telephone字段有時會丟失,因此,該腳本因KeyError失敗,因爲此條目中缺少密鑰電話
所以,我的問題:我怎麼能運行這個腳本,留下一個空白空間電話丟失? 我試過:

if entrie['extensions']['telephone']: 
    tel=entrie['extensions']['telephone'] 

但我認爲不好。

回答

11

使用dict.get而不是[]

entries['extensions'].get('telephone', '') 

或者,乾脆:

entries['extensions'].get('telephone') 

get將返回第二個參數(默認情況下,None),而不是養KeyError時找不到鍵。

0

有幾個有用的字典功能,你可以用它來處理這個。

首先,你可以使用in測試在字典中是否存在的關鍵:

if 'telephone' in entrie['extensions']: 
    tel=entrie['extensions']['telephone'] 

get也可能是有用的;它可以讓你如果密鑰丟失指定一個默認值:

tel=entrie['extensions'].get('telephone', '') 

除此之外,你可以看看標準庫的collections.defaultdict,但可能是矯枉過正。

8

如果數據只在一個地方丟失,那麼dict.get可用於填充缺失的缺失值:

tel = d['entries'][0]['extensions'].get('telelphone', '') 

如果問題比較普遍,你可以有JSON解析器使用defaultdict或自定義字典而不是常規字典。例如,給定的JSON字符串:

json_txt = '''{ 
    "entries": [ 
     { 
      "extensions": { 
       "telephone": "123123", 
       "url": "www.blablablah", 
       "name": "name", 
       "coordinates": "coords", 
       "address": "address" 
      }, 
      "summary": "here is the summary" 
     } 
    ] 
}''' 

與解析它:

>>> class BlankDict(dict): 
     def __missing__(self, key): 
      return '' 

>>> d = json.loads(json_txt, object_hook=BlankDict) 

>>> d['entries'][0]['summary'] 
u'here is the summary' 

>>> d['entries'][0]['extensions']['color'] 
'' 

作爲一個側面說明,如果你想清理你的數據集和執行的一致性,有一個叫精細的工具對JSON(和YAML)進行模式驗證的Kwalify;

+1

不錯,我很喜歡這更好然後'defaultdict '因爲'__missing__'方法中可以添加一些邏輯來捕捉潛在的錯誤。使用'defaultdict'時,我總是畏縮,因爲當我輸錯時我不會得到KeyError。 – 2013-05-11 00:18:03

0

兩種方式。

一個是確保你的字典是標準的,當你閱讀他們的所有領域。另一種是在訪問字典時要小心。

這裏是做的一個例子確保您的字典爲標準:

__reference_extensions = { 
    # fill in with all standard keys 
    # use some default value to go with each key 
    "coordinates" : '', 
    "address" : '', 
    "name" : '', 
    "telephone" : '', 
    "url" : '' 
} 

entrie = json.loads(input_string) 
d = entrie["extensions"] 
for key, value in __reference_extensions: 
    if key not in d: 
     d[key] = value 

以下是訪問的字典時小心一個例子:

for entrie in entries: 
    name = entrie['extensions'].get('name', '') 
    tel = entrie['extensions'].get('telephone', '')