Understanding JSON

Chris Rebert clp2 at rebertia.com
Sun Mar 29 16:58:20 EDT 2009


On Sun, Mar 29, 2009 at 1:39 PM, WallyDD <shanebest at gmail.com> wrote:
> Hello,
>
> I am trying to geocode some map data using the google maps API.
>
> By using the urllib I can get the JSON output;
> http://maps.google.com/maps/geo?q=New+York+USA&output=json&oe=utf8&sensor=true&key=your_api_key
>
> I then read it using;
> gmapiresult = json.loads(fg.read())
> somedata = gmapiresult['Placemark']
>
> result is; (somedata)
> [{u'Point': {u'coordinates': [-73.986951000000005, 40.756053999999999,
> 0]}, u'ExtendedData': {u'LatLonBox': {u'west': -74.25909, u'east':
> -73.699793, u'north': 40.917498999999999, u'south':
> 40.477383000000003}}, u'AddressDetails': {u'Country': {u'CountryName':
> u'USA', u'AdministrativeArea': {u'AdministrativeAreaName': u'NY',
> u'Locality': {u'LocalityName': u'New York'}}, u'CountryNameCode':
> u'US'}, u'Accuracy': 4}, u'id': u'p1', u'address': u'New York, NY,
> USA'}]
>
>
> Can I further refine the data in "somedata" or am I reliant on string
> manipulation?
> all I need to get is the data in "coordinates".
>
> I am not sure if this is a json problem or if I don't understand lists
> well enough.

What you get back from the JSON is just some nested lists and
dictionaries containing the data, not a giant string (wouldn't be a
very useful serialization format then, now would it?).
If you pretty-print the data using pprint.pprint(), it becomes much
more readable (I hope linewrap did not get activated...):

[{u'AddressDetails': {u'Accuracy': 4,
                      u'Country': {u'AdministrativeArea':
{u'AdministrativeAreaName': u'NY',

u'Locality': {u'LocalityName': u'New York'}},
                                   u'CountryName': u'USA',
                                   u'CountryNameCode': u'US'}},
  u'ExtendedData': {u'LatLonBox': {u'east': -73.699793,
                                   u'north': 40.917498999999999,
                                   u'south': 40.477383000000003,
                                   u'west': -74.25909}},
  u'Point': {u'coordinates': [-73.986951000000005, 40.756053999999999, 0]},
  u'address': u'New York, NY,USA',
  u'id': u'p1'}]

So to get the coordinates, you simply do:
coords = somedata[0]['Point']['coordinates']

which gets the first and only element in the toplevel list, and this
element is a dictionary,
and then gets the value associated with the key 'Point' in that
dictionary, which gives us another dictionary (that happens to have
only one key-value pair),
and finally gets the value associated with the key 'coordinates' in
that dictionary, which gives us the desired list of floats.

Cheers,
Chris
-- 
I have a blog:
http://blog.rebertia.com



More information about the Python-list mailing list