0

入力に応じてjsonの構造が異なるYahoo Placemaker APIを使用しています。シンプルな json ファイルは次のようになります。

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

itemDetails にアクセスしたいときは、json_file['document']['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 に自動的にアクセスするための最良の方法は何でしょうか?

4

1 に答える 1

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)注:またはを使用すると、0と1の前後の一重引用符を非表示にできint(k)ます。

編集: 両方のケースにシームレスにアクセスしたい場合(結果が1つであろうと多数であろうと)、次のことを確認できます。

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'}

次に、item_detailsdictをループします。

于 2012-05-04T21:06:49.323 に答える