2011-01-09 12 views
2

JSONをPythonで使い始めようとしていますが、JSONの概念で何かを誤解しているようです。私はgoogle api exampleに従っていますが、うまくいきます。しかし、私はJSONレスポンスの下位レベル(下図のように、私は場所へのアクセスを取得しようとする場合)にコードを変更したときに、私は以下のコードのために、次のエラーメッセージが表示されます。PythonでJSONファイルを解析する - > google map api

Traceback (most recent call last):
File "geoCode.py", line 11, in
<module>
test = json.dumps([s['location'] for s in jsonResponse['results']], indent=3) KeyError: 'location'

どのようにすることができます私はPythonでJSONファイルの情報レベルを下げることができますか?上位レベルに移動して結果文字列を検索する必要がありますか?それは私にはとても変わったようですね?ここで

は、私が実行しようとしているコードです:

import urllib, json 
URL2 = "http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false" 
googleResponse = urllib.urlopen(URL2); 
jsonResponse = json.loads(googleResponse.read()) 
test = json.dumps([s['location'] for s in jsonResponse['results']], indent=3) 
print test 

答えて

17

がさんjsonResponse理解するためのキーの形式は、それをプリントアウトすることです:

import urllib, json 
import pprint 

URL2 = "http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false" 

googleResponse = urllib.urlopen(URL2) 
jsonResponse = json.loads(googleResponse.read()) 
pprint.pprint(jsonResponse) 
# {u'results': [{u'address_components': [{u'long_name': u'1600', 
#           u'short_name': u'1600', 
#           u'types': [u'street_number']}, 
#          {u'long_name': u'Amphitheatre Pkwy', 
#           u'short_name': u'Amphitheatre Pkwy', 
#           u'types': [u'route']}, 
#          {u'long_name': u'Mountain View', 
#           u'short_name': u'Mountain View', 
#           u'types': [u'locality', 
#             u'political']}, 
#          {u'long_name': u'San Jose', 
#           u'short_name': u'San Jose', 
#           u'types': [u'administrative_area_level_3', 
#             u'political']}, 
#          {u'long_name': u'Santa Clara', 
#           u'short_name': u'Santa Clara', 
#           u'types': [u'administrative_area_level_2', 
#             u'political']}, 
#          {u'long_name': u'California', 
#           u'short_name': u'CA', 
#           u'types': [u'administrative_area_level_1', 
#             u'political']}, 
#          {u'long_name': u'United States', 
#           u'short_name': u'US', 
#           u'types': [u'country', 
#             u'political']}, 
#          {u'long_name': u'94043', 
#           u'short_name': u'94043', 
#           u'types': [u'postal_code']}], 
#    u'formatted_address': u'1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA', 
#    u'geometry': {u'location': {u'lat': 37.4216227, 
#           u'lng': -122.0840263}, 
#        u'location_type': u'ROOFTOP', 
#        u'viewport': {u'northeast': {u'lat': 37.424770299999999, 
#               u'lng': -122.0808787}, 
#           u'southwest': {u'lat': 37.418475100000002, 
#               u'lng': -122.0871739}}}, 
#    u'types': [u'street_address']}], 
# u'status': u'OK'} 

test = json.dumps([s['geometry']['location'] for s in jsonResponse['results']], indent=3) 
print(test) 
# [ 
# { 
#  "lat": 37.4216227, 
#  "lng": -122.0840263 
# } 
# ] 
  1. jsonResponseは辞書です。
  2. jsonResponse['results']は、dictsのリストです。
  3. ループfor s in jsonResponse['results']は、ループを介して の各繰り返しに対してdictに sを割り当てます。
  4. s['geometry']はdictです。
  5. s['geometry']['location'] (最終的に!)には 緯度経度が含まれています。
0

それを混乱まず、負荷の原因となるが、輸入JSONとavaialbleではない、それはそう、JSONなど

輸入のsimplejsonなければならない:

import urllib 
import simplejson as json 
import pprint 

URL2 = "http://pbx/a/kiosks" 

googleResponse = urllib.urlopen(URL2) 
jsonResponse = json.loads(googleResponse.read()) 
pprint.pprint(jsonResponse) 
関連する問題