2017-08-31 17 views
2

私は以下のようなJSONオブジェクトを持っています。実際に巨大なJSONファイルは、この質問をするために簡略化されています。ネストされた辞書の中にあるアクセスキーPython

"header": { 
     "headerAttributes": { 
      "pageCount": 5, 
      "totalCount": 5 
     } 
    }, 
"payload": [ 
    { 
     "firstKey": [ 
       { 
        "nestedKey_1": "1", 
        "nestedKey_2": "2" 
       }, 
       { 
        "nestedKey_3": "3", 
        "nestedKey_4": "4" 
       } 
      ] 
    } 
] 

私は[]内の値にアクセスするために以下のpythonコードを書いています。

Total_Orders_Count = json_response ['header']['headerAttributes']['totalCount'] 
for i in range(0,Total_Orders_Count): 
      dict = json_response ['payload'][i] 
      inner_dict = dict ['firstKey'] [0] 
      print inner_dict ['nestedKey_1'] + '(' + inner_dict['nestedKey_2'] + ')' 

上記のコードは正常に動作します。しかし、dict ['firstKey'] [0]の使用は1より大きい値では機能しません。

2つの質問。 1. []内のKey値にアクセスするには、より良い方法がありますか? 2. []内の値の長さを見つけることができますか?このリストでは、 "firstKey"の下の値の長さは2です。

何か助けていただければ幸いです。

+0

「辞書の使用を[ 『のfirstKey』] [0]が動作しません1 "以上の値は?どういう意味ですか? –

+1

また、あなたの変数 'dict'を呼び出さない –

+0

' len(json_response ['payload'] [i] ['firstKey']) ' – Barmar

答えて

2

リストをただループする。アップフロントの長さを知る必要はありません。

for d in json_response ['payload']: 
    for inner_dict in d['firstKey']: 
     print '{0[nestedKey_1]}({0]nestedKey_2})'.format(inner_dict) 

for <name> in <listobject>ループがfor each constructです。インデックスは生成されません。その代わりに、ループはリストの各要素をターゲット名に割り当てます。

内蔵タイプのマスクを避けるため、dictdに変更しました。私はstring formattingを使って、内側の辞書からの値を文字列に入れました。

totalCountキーを使用して削除しました。ここでその価値観を見る必要はありません。

リストの長さを調べるには、len() functionを使用してください。ここでも、その関数を使用する必要はありません。ここではです。リストを直接反復することで、インデックスを前もって生成する必要がなくなります。

0

提供したJSONでは、ペイロードの外側のリストには1つの要素しかありません。しかし、コードは存在しないリストの最初の5つの要素にアクセスしようとします。

di['key']のようなリスト内の値に直接アクセスすることを避けるようにしてください。存在しない場合は、代わりに 'di.get(' key '、' default ') `を使用してください。

キー値をループし

、次のコードを使用し、「のfirstKey」の下の値の長さを得る:

for payload in json_response.get('payload',[]) : 
    # Length of values under firstKey 
    print(len(payload.get('firstKey',[]))) 
    # To access nested Keys 
    for i in payload.get('firstKey',[]) : 
     for k,v in i.items() : 
      print(k,':',v) 
関連する問題