2016-08-06 16 views
-1

Pythonでデータを読み込めません。行の1つのサンプルがある:私はjsonをロードするとPythonで入れ子になったJSONリストと辞書の文字列を読む

foo_brackets='{"KEY2":[{"KEY2a":[{"KEY2a1":"4","KEY2a2":"5"},{"KEY2a1":"6","KEY2a2":"7"}],"KEY2b":"8"}],"KEY3":"9"}' 

KEY2の値はその後、私の希望する結果になってから私を防止する、なぜならブラケットの、リストとして読み込まれ、その私はちょうど括弧を削除しようとすることができますが、実際のリスト、KEY2aあるべき値がある

>>> import json 
>>> foo_brackets_json=json.loads(foo_brackets) 
>>> foo_brackets_json['KEY2']['KEY2b'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 

KEY2bの値です。あなたは私がすべてのブラケットを取り除く場合は、これを見るとJSONに変換しようとすることができます:

>>> foo_no_brackets='{"KEY2":{"KEY2a":{"KEY2a1":"4","KEY2a2":"5"},{"KEY2a1":"6","KEY2a2":"7"},"KEY2b":"8"},"KEY3":"9"}' 
>>> json.loads(foo_no_brackets) 
# Traceback omitted since it's just the python error 
ValueError: Expecting property name: line 1 column 45 (char 45) 

foo_bracketsは有効なJSONのように見えるん(私は引用符を削除して、hereをテストした)、以下を得た:

{ 
    "KEY2":[ 
     { 
     "KEY2a":[ 
      { 
       "KEY2a1":"4", 
       "KEY2a2":"5" 
      }, 
      { 
       "KEY2a1":"6", 
       "KEY2a2":"7" 
      } 
     ], 
     "KEY2b":"8" 
     } 
    ], 
    "KEY3":"9" 
} 

質問:

私はfoo_brackets_json['KEY2']['KEY2b']を呼び出すことができるようにfoo_bracketsのようなオブジェクトを読み込むための方法はありますか?

+2

'foo_brackets_json ['KEY2'] [0] ['KEY2b']'を使って何が問題になっていますか? –

+3

なぜあなたはそれらの括弧が「余分」だと思いますか?あなたが発見したとおり、有効なJSONであり、* list *を表します。彼らはあなたが1つの入れ子にされた辞書以外には何も存在するとは思わない以外の「余分な」ものではありません。 –

+0

あなたは両方の権利を持っています - クイックフィードバックに感謝します。それはリストと辞書の組み合わせによって見られ、捨てられたのとはちょうど異なるフォーマットでした。 – Tchotchke

答えて

1

foo_brackets_json['KEY2']を参照してください。リストここでは1つの要素があります。

あなたがそのリストに含まれている辞書を参照するために整数インデックスを使用する必要があります:

foo_brackets_json['KEY2'][0]['KEY2b'] 

括弧を削除しようとしないでください。ここには0個以上のネストされた辞書があります。ネストされた辞書が1つしかない場合、何が起こるべきかを判断する必要があります。

上記のハードコーディングされたリファレンスは、リストに少なくとも1つのそのような辞書が常に存在することを前提とし、複数の辞書が存在するかどうかは気にしません。

あなたは0以上のケースを処理するためにをループを使用することができます。

for nested in foo_brackets_json['KEY2']: 
    print(nested['KEY2b']) 

今、あなたは、ネストされた各辞書、一つずつ処理しています。これは、空リストの場合、および複数のリストが存在する場合に機能します。

あなたは0または複数のエラーを持つ作ることができます:

など
if len(foo_brackets_json['KEY2']) != 1: 
    raise ValueError('Unexpected number of results') 

など全てはあなたの実際のユースケースに依存します。

関連する問題