2013-05-10 19 views
8

PythonでJSONを解析する際に問題が発生しましたが、今は止まっています。
問題は、JSONのエンティティが常に同じではないということです。 、PythonでJSONを解析する:空白のフィールド

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

を時々、JSONは、例えば、すべての「フィールド」を、持っていないため、問題が来る:私は例えば、JSONを通って移動することができる

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

:JSONのようなものですtelephoneフィールドが欠落していることがあります。そのため、の電話番号が存在しないため、スクリプトはKeyErrorで失敗します。
私の質問:どのように空白を残して、このスクリプトを実行することができます電話がありません? 私は試しました:

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

私はそうでもないと思います。

答えて

11

代わり[]の使用dict.get

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

それとも、単に:鍵が見つからないとき

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

getではなくKeyErrorを上げるの第二引数(デフォルト、None)を返します。

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パーサーを使用aを持つことができますdefaultdictまたは通常の辞書の代わりにカスタム辞書たとえば、JSON文字列を与えられた:あなたはあなたのデータセットを、クリーンアップと一貫性を強化したい場合は、と呼ばれる細かなツールがあり、注意点として

>>> 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_txt = '''{ 
    "entries": [ 
     { 
      "extensions": { 
       "telephone": "123123", 
       "url": "www.blablablah", 
       "name": "name", 
       "coordinates": "coords", 
       "address": "address" 
      }, 
      "summary": "here is the summary" 
     } 
    ] 
}''' 

はでそれを解析Kwalify JSON(およびYAML)でスキーマの検証を行います。

+1

ニース、私はdefaultdict 'その後、より良い本が好き。ここ

は、必ずあなたの辞書が標準装備されて作るの一例です'__missing__'メソッドの中に潜在的なバグを捕まえるためのロジックを追加することができるからです。 'defaultdict'では、私は誤字を犯すとKeyErrorを取得しないので、私はいつもうんざりしています。 –

0

2通りあります。

1つは、あなたの辞書が標準であることを確認することです、そして、あなたがそれらを読むとき、すべてのフィールドを持っていることです。もう1つは、辞書にアクセスする際には注意が必要です。ここで

__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', '') 
関連する問題