2017-04-14 13 views
1

私はの値を取得しようとしているの最初のオブジェクトのdirectionstationこのJSONに戻ったが、私は次のエラーここKeyError例外:0 Pythonの

KeyError: 0

を取得しています私のコードです:

print(json.dumps(savedrequest, indent=4)) 
savedstation = savedrequest[0]['station'] 
saveddirection = savedrequest[0]['direction'] 

そして、これは、それが印刷に戻っているものです:

{ 
    "-bas": { 
     "email_address": "[email protected]", 
     "direction": "Southbound", 
     "station": "place-har" 
    }, 
    "-bus": { 
     "email_address": "[email protected]", 
     "direction": "Southbound", 
     "station": "place-su" 
    } 
} 

-basまたは-busが返されたときに何が起きるか分からないので、配列の最初のオブジェクトを選択する必要があります。

+1

savedrequest'が配列でない '、それは '0'キーを持っていません。 '' -bas''(または '' -bus'')を使う必要があります。 –

+0

その配列では、最初のオブジェクトを選択し、それらの 'direction'と' station'キーから値を取得する方法がありますか? – beaconhill

+0

なぜキー「0」にアクセスしていますか? –

答えて

3

JSONは「オブジェクト」(Pythonではdictと呼ばれます)にデコードされましたが、配列ではありません。したがって、特別な「注文」はありません。 「最初の」要素が実際にはそのように格納されないかもしれないと思うもの。同じオブジェクトが毎回最初になるという保証はありません。あなたが試みることができる何

は、しかし、json.loads(およびjson.load)のobject_pairs_hookパラメータを使用してOrderedDict Sにこれらdict秒に変換することです。 OrderedDictdictと似ていますが、注文要素が挿入されたことを覚えています。

import json 
from collections import OrderedDict 

savedrequest = json.loads(data, object_pairs_hook=OrderedDict) 

# Then you can get the "first" value as `OrderedDict` remembers order 
#firstKey = next(iter(savedrequest)) 
first = next(iter(savedrequest.values())) 

savedstation = first['station'] 
saveddirection = first['direction'] 

(この答えはhttps://stackoverflow.com/a/6921760https://stackoverflow.com/a/21067850のおかげで)