2017-01-23 4 views
1

私はこのコードを数時間試して、提供されたjsonデータを繰り返し処理しています。これらのネストされたリストとオブジェクトを適切に反復処理する方法を理解できます。jsonデータとPythonを継承する

import json 

data = """ 
{ 
"tracks": "1", 
"timeline": { 
"0.733251541": [ 
    { 
    "id": 1, 
    "bounds": { 
     "Width": 0.5099463905313426, 
     "Height": 0.2867199993133546, 
     "Y": 0.4436400003433228, 
     "X": 0.4876505160745349 
    } 
    } 
], 
"0.965": [ 
    { 
    "id": 1, 
    "bounds": { 
     "Width": 0.4205311330135182, 
     "Height": 0.2363199994340539, 
     "Y": 0.2393400002829731, 
     "X": 0.1593787633901481 
    } 
    } 
], 
"1.098224": [ 
    { 
    "id": 1, 
    "bounds": { 
     "Width": 0.4568560813801344, 
     "Height": 0.2564799993857742, 
     "Y": 0.1992600003071129, 
     "X": 0.1000513407532317 
    } 
    } 
] 
    }, 
"taggedTracks": { 
"1": "dirk" 
} 
} 
""" 

json = json.loads(data) 

for a in json["timeline"]: 
    for b in a: 
     for c in b["bounds"]: 
      print a, c["Width"], c["Height"], c["Y"], c["X"] 

提供されているjsonデータの取り扱い方法について、誰かが正しい方向に向かってください。

次のエラーが発生します。

Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
TypeError: string indices must be integers 

答えて

2

"タイムライン"の各値の中に最初にリストがあるので、TypeErrorを取得しています。インデックスの0を使用して、そのリストの最初の値を取る必要があります。その後、残りの部分を解析することができます。次のコードは役立ちます

は、うまくいけば:

import json 

data = """ 
{ 
"tracks": "1", 
"timeline": { 
"0.733251541": [ 
{ 
    "id": 1, 
    "bounds": { 
    "Width": 0.5099463905313426, 
    "Height": 0.2867199993133546, 
    "Y": 0.4436400003433228, 
    "X": 0.4876505160745349 
    } 
} 
], 
"0.965": [ 
{ 
    "id": 1, 
    "bounds": { 
    "Width": 0.4205311330135182, 
    "Height": 0.2363199994340539, 
    "Y": 0.2393400002829731, 
    "X": 0.1593787633901481 
    } 
} 
], 
"1.098224": [ 
{ 
    "id": 1, 
    "bounds": { 
    "Width": 0.4568560813801344, 
    "Height": 0.2564799993857742, 
    "Y": 0.1992600003071129, 
    "X": 0.1000513407532317 
    } 
} 
] 
}, 
"taggedTracks": { 
"1": "dirk" 
} 
} 
""" 

test_json = json.loads(data) 

for num, data in test_json["timeline"].iteritems(): 
    print(num+":") 
    bounds = data[0]["bounds"] 
    for bound, value in bounds.iteritems(): 
     print('\t'+bound+": "+str(value)) 
0

まず第一に、それはそれはモジュールの名前であるため、変数の名前jsonを使用するように素晴らしいアイデアではありません。代わりにjを使ってみましょう。

とにかく、json.loads()を実行すると、dictが返されます。 for a in <dict>を反復すると、キーの一覧が表示されます(唯一)。代わりに、iteritems()のようなキーと値を繰り返し処理できます。

for k, a in j['timeline'].iteritems(): 
    for b in a: 
     c = b['bounds'] 
     print k, c["Width"], c["Height"], c["Y"], c["X"]