And this is where Python comes in. If you have been working with Python for a while, you will have noticed that JSON is nothing more than a Python Dictionary. This makes accessing the key/value quite effortless. To give you a simple example, here's an output of a simple address query using Google's Geocoding API: http://maps.googleapis.com/maps/api/geocode/json?address=8-10%20Broadway,%20London%20SW1H%200BG,%20United%20Kingdom&sensor=false
{ "results" : [ { "address_components" : [ { "long_name" : "8-10", "short_name" : "8-10", "types" : [ "street_number" ] }, { "long_name" : "Broadway", "short_name" : "Broadway", "types" : [ "route" ] }, { "long_name" : "Westminster", "short_name" : "Westminster", "types" : [ "sublocality", "political" ] }, { "long_name" : "London", "short_name" : "London", "types" : [ "locality", "political" ] }, { "long_name" : "Greater London", "short_name" : "Gt Lon", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "United Kingdom", "short_name" : "GB", "types" : [ "country", "political" ] }, { "long_name" : "SW1H 0BG", "short_name" : "SW1H 0BG", "types" : [ "postal_code" ] }, { "long_name" : "London", "short_name" : "London", "types" : [ "postal_town" ] } ], "formatted_address" : "8-10 Broadway, Westminster, London, Greater London SW1H 0BG, UK", "geometry" : { "location" : { "lat" : 51.49873430, "lng" : -0.13312210 }, "location_type" : "ROOFTOP", "viewport" : { "northeast" : { "lat" : 51.50008328029150, "lng" : -0.1317731197084980 }, "southwest" : { "lat" : 51.49738531970850, "lng" : -0.1344710802915020 } } }, "types" : [ "street_address" ] } ], "status" : "OK" }
What is displayed above is the result of the URL we supplied to Google's Geocoding API. Of course, we couldn't display that to our users - that would be daft. Most of the time you'd want to parse this info and use the values in your application. In our case we had to extract the Lat and Long for our application. There was no need to display the JSON - Python makes this a breeze and all we need is to use Python's urllib2 module to open up the URL and read the result. So, to parse that and display the full address in human-readable format, it's as simple as doing something list this: >>> import json >>> import urllib2 >>> j = urllib2.urlopen('http://maps.googleapis.com/maps/api/geocode/json?address=8-10%20Broadway,%20London%20SW1H%200BG,%20United%20Kingdom&sensor=false') >>> js = json.load(j) Please note that we used load() instead of loads(). You would typically use loads() for strings, but load() is designed for resources such as files and - and in our example - a URL. Now to display the address, we simply loop through our dictionary like so: >>> ourResult = js['results'][0]['address_components'] >>> for rs in ourResult: ... print rs['long_name'] ... 8-10 Broadway Westminster London Greater London United Kingdom SW1H 0BG London >>> With that out of the way, what about our main focus which is to print the coordinate of a particular address? Well, it turns out that that is even a lot simpler. This time we just navigate our way down until we find what we're after. Which in this case is the latitude and longitude. >>> ourResult = js['results'][0]['geometry']['location'] >>> print ourResult['lat'], ourResult['lng'] 51.4987343 -0.1331221 >>> One other cool thing about parsing JSON with Python is that you can quickly and easily map the results into your Django Model and do anything dangoey with it. Here's an example: objs = json.loads(request.POST) # Iterate through the stuff in the list for o in objs: # Do something Djangoey with o's name and message, like record = myDjangoModel(name = o.name, message = o.message) record.save() Now, if you are looking to mix Python, JSON and Django together - it is as simple what we've just shown above.
No comments:
Post a Comment