2017-12-16 10 views
-1

PythonからJSONを読み込もうとしています。ここに私のJSONオブジェクトがジオコード要求から返されます。PythonからJSONオブジェクトを読み取ると、タイプエラーが発生する

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "Race Course Lane", 
       "short_name" : "Race Course Ln", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Little India", 
       "short_name" : "Little India", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "Singapore", 
       "short_name" : "Singapore", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Singapore", 
       "short_name" : "SG", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "Race Course Ln, Singapore", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 1.3103311, 
        "lng" : 103.85354 
       }, 
       "southwest" : { 
        "lat" : 1.3091323, 
        "lng" : 103.8523656 
       } 
      }, 
      "location" : { 
       "lat" : 1.3097033, 
       "lng" : 103.8529918 
      }, 
      "location_type" : "GEOMETRIC_CENTER", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 1.311080680291502, 
        "lng" : 103.8543017802915 
       }, 
       "southwest" : { 
        "lat" : 1.308382719708498, 
        "lng" : 103.8516038197085 
       } 
      } 
     }, 
     "place_id" : "ChIJe5XzBMcZ2jERclOJt-xVp_o", 
     "types" : [ "route" ] 
     } 
    ], 
    "status" : "OK" 
} 

私はジオメトリの下formatted_addressと緯度LNGを取得しようとしています。ここに私のコードは次のとおりです。

json_data = requests.get(url).json() 

formatted_address = json_data['results'][0]['formatted_address'] 
print(formatted_address) 
for each in json_data['results'][0]['geometry']: 
    print(each['lat']) 

私はフォーマットされたアドレスをプリントアウトするために管理が、私はこのエラーメッセージ取得しています:

Traceback (most recent call last): 
File "D:\Desktop\test.py", line 16, in <module> 
print(each['lat']) 

はTypeError例外:文字列のインデックスは整数

任意のアイデアでなければなりませんの?ありがとう!

+0

'for x in d ['results'] [0] ['geometry']'結果はキーの繰り返しになります。 –

+0

そして、キーは文字列なので、 'str [str]'はエラーになります。おそらくあなたが望むだろう: 'x = json_data ['results'] [0] ['geometry']; for each in x:x [each] ['lat'] ' –

+0

これは、すべてのキーと値のペアがlatキーでdictを持つわけではないので、別のエラーになります。 JSONをもう一度見て、座標フォームを抽出したいところを見つけてください。 「場所」? –

答えて

2

json_data['results'][0]['geometry']は、_dict_である。これは、for x in json_data['results'][0]['geometry']がキーに対して繰り返し処理を行うことを意味します。xは、キー(文字列)が割り当てられたループ変数です。ここでは一例です -

d = {'a' : 'b', 'c' : 'd'} 

for each in d: 
    print(x) 

a 
c 

eachが文字列であるので、(あなたがいないインデックス整数以外の何の文字列ができるので)、each['lat']が無効な操作になります。


あなたのJSONファイルの構造を観察 -

{ 
    "location_type": "GEOMETRIC_CENTER", 
    ... 

    "location": { 
     "lng": 103.8529918, 
     "lat": 1.3097033 
    } 
} 

は慎重にのみlocationは、それに関連付けられたlatlngキーを持つ辞書を持っていることを確認します。これらの値がすべて必要な場合は、直接インデックスに登録します。ループは必要ありません。

x = json_data['results'][0]['geometry']['location'] 
lat, lng = x['lat'], x['lng'] 
+0

@COLDSPEEDねえ、ちょっと調べてみてください。私はいくつかのアドレスでこのエラーメッセージを受け取りました:IndexError:リストのインデックスが範囲外です。たとえば、アドレスAでは、初めて実行したときにこのエラーメッセージが表示されます。それから私はもう一度走って、それは私に緯度経緯を返します。それから3回目に走り、エラーメッセージをもう一度聞いています。私は応答が返ってくる前に各アドレスをあまりにも速く繰り返しているからでしょうか? – hyperfkcb

+0

@hyperfkcbいいえ、それは決して起こりません。反復が開始される前に、応答が常に受信されます。 try-exceptブロックを使用してエラーをキャッチし、その状況でレスポンスを出力して、どこが間違っているかを確認することをお勧めします。 –

関連する問題