I'm trying to parse the JSON response from the GoogleMaps API to read values from a nested dict into a Pandas DataFrame. The structure of the JSON response is shown below.
I'm trying to create a DataFrame called 'address_components' with ('types', 'short_name', 'long_name') as the column headers and the respective values from each address query as rows.
I've tried to use ijson:
from ijson import items
import ijson
f = urlopen('https://maps.googleapis.com/maps/api/geocode/json?address=2022+Boren+Ave%2C+Seattle+98101')
objects = list(ijson.items(f, 'results.address_components'))
objects
Out: []
My problem is successfully traversing the nested dicts.
I've also reviewed the GoogleMaps GeoLocator API Documentation, and the GoogleMaps JSON parsing docs. This solution seems to solve the problem, but on IOS
Not helping me to reach into the nest...
"results" : [
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Amphitheatre Pkwy",
"short_name" : "Amphitheatre Pkwy",
"types" : [ "route" ]
},
{
"long_name" : "Mountain View",
"short_name" : "Mountain View",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Santa Clara County",
"short_name" : "Santa Clara County",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "California",
"short_name" : "CA",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "94043",
"short_name" : "94043",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
"geometry" : {
"location" : {
"lat" : 37.4224764,
"lng" : -122.0842499
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 37.4238253802915,
"lng" : -122.0829009197085
},
"southwest" : {
"lat" : 37.4211274197085,
"lng" : -122.0855988802915
}
}
},
"place_id" : "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
"types" : [ "street_address" ]
}
],
"status" : "OK"
}
you can use json_normalize() for that::
import requests
import json
import pandas as pd
url = 'https://maps.googleapis.com/maps/api/geocode/json?address=2022+Boren+Ave%2C+Seattle+98101'
r = requests.get(url)
if r.status_code != requests.codes.ok:
r.raise_for_status()
results = json.loads(r.text)
df = pd.io.json.json_normalize(results['results'], 'address_components')
print(df)
Test:
In [17]: pd.io.json.json_normalize(results['results'], 'address_components')
Out[17]:
long_name short_name types
0 2022 2022 [street_number]
1 Boren Avenue Boren Ave [route]
2 Belltown Belltown [neighborhood, political]
3 Seattle Seattle [locality, political]
4 King County King County [administrative_area_level_2, political]
5 Washington WA [administrative_area_level_1, political]
6 United States US [country, political]
7 98121 98121 [postal_code]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With