2012-05-04 17 views
0

私は、入力に応じてjsonの異なる構造を与えるYahoo Placemaker APIを使用しています。 単純なJSONファイルは、次のようになりますPythonで可変構造のjsonファイルを解析する

{ 
    'document':{ 
     'itemDetails':{ 
      'id'='0' 
      'prop1':'1', 
      'prop2':'2' 
     } 
     'other':{ 
      'propA':'A', 
      'propB':'B' 
     } 
    } 
} 

私は単に[ 'itemDetails'] [ 'ドキュメント'] json_file書くitemDetailsにアクセスしたいときに。私は、より複雑な応答を得るとき

しかし、のような

{ 
    'document':{ 
     '1':{ 
     'itemDetails':{ 
      'id'='1' 
      'prop1':'1', 
      'prop2':'2' 
     } 
     }, 
     '0':{ 
     'itemDetails':{ 
      'id'='0' 
      'prop1':'1', 
      'prop2':'2' 
     }, 
     '2':{ 
     'itemDetails':{ 
      'id'='1' 
      'prop1':'1', 
      'prop2':'2' 
     } 
     'other':{ 
      'propA':'A', 
      'propB':'B' 
     } 
    } 
} 

解決策は明らかに動作しません。

id、prop1、prop2を使用してオブジェクトを作成します。

json_file ['document'] ['0'] ['itemDetails']を書くことなく、2番目のケースでitemDetailsに自動的にアクセスするにはどうすればよいでしょうか?その後、

+0

'json_file ['document'] ['0'] ['itemDetails']'の何が問題なのですか?両方のケースで同じコードを使用したいのですか? – yak

答えて

1

私が正しく理解していれば、あなたはjson_file['document']['0']['itemDetails']のすべてをループにしたい、json_file['document']['1']['itemDetails']、...

そのような場合、:

item_details = {} 
for key, value in json_file['document']: 
    item_details[key] = value['itemDetails'] 

あるいは、ワンライナー:

item_details = {k: v['itemDetails'] for k, v in json_file['document']}

その後、あなたはitem_details['0']item_details['1']としてそれらにアクセスし、...

注:int(key)またはint(k)を使用すると、0と1の前後の単一引用符を抑制できます。

編集: あなたは(1つの結果または多くがあるかどうか)をシームレス両方のケースにアクセスする場合は、あなたがチェックすることができ:item_details辞書通じ

if 'itemDetails' in json_file['document']: 
    item_details = {'0': json_file['document']['itemDetails']} 
else: 
    item_details = {k: v['itemDetails'] for k, v in json_file['document'] if k != 'other'} 

次にループを。

関連する問題