Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: Find location of data within JSON object, parse the corresponding data

Tags:

python

json

I am getting this JSON object from a Simplegeo request. For certain areas, you will not have Address data. In those cases, I want to be able to find the part in the data with "subcategory":"County" and then query the corresponding name.

What is the best way to find the location of data within a JSON response and grab the correesponding data?

{
    "query": {
        "latitude": 34.078195,
        "longitude": -118.185497,
        "address": "90032",
        "confidence": 0.714,
        "precision": "zip"
    },
    "timestamp": 1313717557.449,
    "features": [
        {
            "handle": "SG_13ChTM4q9Qo0OoZI5q453G_34.078617_-118.185973",
            "href": "http://api.simplegeo.com/1.0/features/SG_13ChTM4q9Qo0OoZI5q453G_34.078617_-118.185973.json",
            "abbr": null,
            "attribution": "(c) OpenStreetMap (http://openstreetmap.org/) and contributors",
            "classifiers": [
                {
                    "category": "Commercial Area",
                    "type": "Public Place",
                    "subcategory": null
                }
            ],
            "name": "KMPC-AM",
            "license": "http://creativecommons.org/licenses/by-sa/2.0/",
            "bounds": [
                -118.187194,
                34.076831,
                -118.184752,
                34.080421
            ]
        },
        {
            "handle": "SG_5zlubcQBdPWX5zY02QtxeT_34.080185_-118.184829",
            "name": "06037201401",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.193786,
                34.075513,
                -118.178021,
                34.086444
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_5zlubcQBdPWX5zY02QtxeT_34.080185_-118.184829.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "US Census",
                    "type": "Region",
                    "subcategory": "Tract"
                }
            ]
        },
        {
            "handle": "SG_01i8SelQjR6LBuBBGei63D_34.081001_-118.177407",
            "name": "El Sereno",
            "license": "Not For Redistribution",
            "bounds": [
                -118.19758,
                34.061731,
                -118.155504,
                34.105109
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_01i8SelQjR6LBuBBGei63D_34.081001_-118.177407.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Neighborhood",
                    "type": "Region",
                    "subcategory": null
                }
            ]
        },
        {
            "handle": "SG_0Zvp5oQfiIlufuV5WlR0Bs_34.079519_-118.177738",
            "name": "90032",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.202841,
                34.060453,
                -118.155292,
                34.101921
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_0Zvp5oQfiIlufuV5WlR0Bs_34.079519_-118.177738.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Postal Code",
                    "type": "Region",
                    "subcategory": null
                }
            ]
        },
        {
            "handle": "SG_2EAf2lwKihpnQQbH5qQBow_34.085193_-118.233164",
            "name": "Assembly District 45",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.344812,
                34.040466,
                -118.155292,
                34.126937
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_2EAf2lwKihpnQQbH5qQBow_34.085193_-118.233164.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Legislative District",
                    "type": "Region",
                    "subcategory": "Provincial (Lower)"
                }
            ]
        },
        {
            "handle": "SG_0iiFtWc7rXBJ6VYl2kuO0L_34.085508_-117.985139",
            "name": "Congressional District 32",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.196746,
                34.001855,
                -117.840549,
                34.194325
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_0iiFtWc7rXBJ6VYl2kuO0L_34.085508_-117.985139.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Legislative District",
                    "type": "Region",
                    "subcategory": "National"
                }
            ]
        },
        {
            "handle": "SG_7NZeInBzM4Mv73P62VZzjl_34.074117_-117.991920",
            "name": "State Senate District 24",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.215856,
                33.986182,
                -117.840549,
                34.194731
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_7NZeInBzM4Mv73P62VZzjl_34.074117_-117.991920.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Legislative District",
                    "type": "Region",
                    "subcategory": "Provincial (Upper)"
                }
            ]
        },
        {
            "handle": "SG_63gaN6Xi7zAjBxeFk74UBz_34.106997_-118.411704",
            "name": "Los Angeles",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.668176,
                33.703652,
                -118.155289,
                34.337306
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_63gaN6Xi7zAjBxeFk74UBz_34.106997_-118.411704.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Municipal",
                    "type": "Region",
                    "subcategory": "City"
                }
            ]
        },
        {
            "handle": "SG_5lHwuPKvcJYpKhy8MR1ZMZ_34.100887_-118.390729",
            "name": "Los Angeles Unified School District",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.668058,
                33.659547,
                -118.142667,
                34.353672
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_5lHwuPKvcJYpKhy8MR1ZMZ_34.100887_-118.390729.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "School District",
                    "type": "Region",
                    "subcategory": "Unified"
                }
            ]
        },
        {
            "handle": "SG_6RRdLsqpHXF3Yu1EXCPORn_33.971007_-117.971917",
            "name": "Los Angeles",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.991667,
                33.391667,
                -117.008333,
                34.333333
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_6RRdLsqpHXF3Yu1EXCPORn_33.971007_-117.971917.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Urban Area",
                    "type": "Region",
                    "subcategory": null
                }
            ]
        },
        {
            "handle": "SG_6Em6St6NgZtuvorHtngjTU_34.197952_-118.261063",
            "name": "Los Angeles",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -118.951721,
                32.75004,
                -117.645604,
                34.823193
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_6Em6St6NgZtuvorHtngjTU_34.197952_-118.261063.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Administrative",
                    "type": "Region",
                    "subcategory": "County"
                }
            ]
        },
        {
            "handle": "SG_2MySaPILVQG3MoXrsVehyR_37.215297_-119.663837",
            "name": "California",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -124.482003,
                32.528832,
                -114.131211,
                42.009517
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_2MySaPILVQG3MoXrsVehyR_37.215297_-119.663837.json",
            "abbr": "CA",
            "classifiers": [
                {
                    "category": "Subnational",
                    "type": "Region",
                    "subcategory": "State"
                }
            ]
        },
        {
            "handle": "SG_3tLT0I5cOUWIpoVOBeScOx_41.316130_-119.116571",
            "name": "America/Los_Angeles",
            "license": "creativecommons.org/publicdomain/zero/1.0/",
            "bounds": [
                -124.733253,
                32.534622,
                -114.039345,
                49.002892
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_3tLT0I5cOUWIpoVOBeScOx_41.316130_-119.116571.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "Time Zone",
                    "type": "Region",
                    "subcategory": null
                }
            ]
        },
        {
            "handle": "SG_3uwSAEdXVBzK1ZER9Nqkdp_45.687160_-112.493107",
            "name": "United States of America",
            "license": "http://creativecommons.org/publicdomain/mark/1.0/",
            "bounds": [
                -179.142471,
                18.930138,
                179.78115,
                71.41218
            ],
            "href": "http://api.simplegeo.com/1.0/features/SG_3uwSAEdXVBzK1ZER9Nqkdp_45.687160_-112.493107.json",
            "abbr": null,
            "classifiers": [
                {
                    "category": "National",
                    "type": "Region",
                    "subcategory": null
                }
            ]
        }
    ],
    "weather": {
        "wind_speed": "0 meters per second",
        "temperature": "84F",
        "dewpoint": "57F",
        "cloud_cover": "0%",
        "wind_direction": "0 degrees",
        "forecast": {
            "tonight": {
                "conditions": "Fog",
                "precipitation": "0%",
                "temperature": {
                    "max": "70F",
                    "min": "66F"
                }
            },
            "tomorrow": {
                "conditions": "Clear",
                "precipitation": "0%",
                "temperature": {
                    "max": "89F",
                    "min": "68F"
                }
            },
            "today": {
                "conditions": "Mostly clear",
                "precipitation": "0%",
                "temperature": {
                    "max": "94F",
                    "min": "71F"
                }
            }
        },
        "conditions": "Clear"
    },
    "demographics": {
        "population_density": 5808,
        "acs": {
            "error": "You must supply ACS table IDs with demographics.acs__table=<table_id_1>&demographics.acs__table=<table_id_2>... parameters."
        }
    },
    "intersections": [
        {
            "distance": 277.0035787874508,
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -118.1874986,
                    34.0800544
                ]
            },
            "properties": {
                "highways": [
                    {
                        "osm_way_id": "13375722",
                        "type": "residential",
                        "name": "Bowman Boulevard"
                    },
                    {
                        "osm_way_id": "13435504",
                        "type": "residential",
                        "name": "Verdemour Avenue"
                    }
                ],
                "attribution": "(c) OpenStreetMap (http://openstreetmap.org/) and contributors",
                "license": "http://creativecommons.org/licenses/by-sa/2.0/"
            },
            "type": "Feature",
            "id": "123133103"
        },
        {
            "distance": 278.5007862228104,
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -118.187905,
                    34.07971
                ]
            },
            "properties": {
                "highways": [
                    {
                        "osm_way_id": "13375722",
                        "type": "residential",
                        "name": "Bowman Boulevard"
                    },
                    {
                        "osm_way_id": "13286592",
                        "type": "residential",
                        "name": "Lynnfield Street"
                    },
                    {
                        "osm_way_id": "13435505",
                        "type": "residential",
                        "name": "Verdemour Avenue"
                    }
                ],
                "attribution": "(c) OpenStreetMap (http://openstreetmap.org/) and contributors",
                "license": "http://creativecommons.org/licenses/by-sa/2.0/"
            },
            "type": "Feature",
            "id": "122609716"
        },
        {
            "distance": 295.66530721862495,
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -118.1870694,
                    34.0805132
                ]
            },
            "properties": {
                "highways": [
                    {
                        "osm_way_id": "13375722",
                        "type": "residential",
                        "name": "Bowman Boulevard"
                    },
                    {
                        "osm_way_id": "13468782",
                        "type": "residential",
                        "name": "Carter Drive"
                    }
                ],
                "attribution": "(c) OpenStreetMap (http://openstreetmap.org/) and contributors",
                "license": "http://creativecommons.org/licenses/by-sa/2.0/"
            },
            "type": "Feature",
            "id": "123133105"
        },
        {
            "distance": 308.18108469988266,
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -118.1830009,
                    34.0763492
                ]
            },
            "properties": {
                "highways": [
                    {
                        "osm_way_id": "13441050",
                        "type": "residential",
                        "name": "Richelieu Avenue"
                    },
                    {
                        "osm_way_id": "13470172",
                        "type": "residential",
                        "name": "Richelieu Terrace"
                    }
                ],
                "attribution": "(c) OpenStreetMap (http://openstreetmap.org/) and contributors",
                "license": "http://creativecommons.org/licenses/by-sa/2.0/"
            },
            "type": "Feature",
            "id": "123621465"
        },
        {
            "distance": 318.5882396290064,
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -118.1840727,
                    34.080806
                ]
            },
            "properties": {
                "highways": [
                    {
                        "osm_way_id": "13313919",
                        "type": "residential",
                        "name": "Bedilion Street"
                    },
                    {
                        "osm_way_id": "13468783",
                        "type": "residential",
                        "name": "Carter Drive"
                    }
                ],
                "attribution": "(c) OpenStreetMap (http://openstreetmap.org/) and contributors",
                "license": "http://creativecommons.org/licenses/by-sa/2.0/"
            },
            "type": "Feature",
            "id": "122784176"
        }
    ],
    "address": {
        "geometry": {
            "coordinates": [
                -118.184913,
                34.076448
            ],
            "type": "Point"
        },
        "properties": {
            "address": "4501 Richelieu Ter",
            "distance": "0.2",
            "postcode": "90032",
            "city": "Los Angeles",
            "county": "Los Angeles",
            "province": "CA",
            "country": "US"
        },
        "type": "Feature"
    }
}
like image 470
Emile Avatar asked Aug 19 '11 20:08

Emile


1 Answers

First you will need to convert your JSON string into a Python dictionary using the json module.

If data is your new dictionary, the information you are looking for is in the list data["features"]. You will need to iterate over this list and filter out any entries that you do not want. In your case, for each item in data["features"], you only want entries where item["classifiers"][0]["subcategory"] == "County".

You can do all of this in a list comprehension, for example:

import json

data = json.loads(json_string)
counties = [item for item in data["features"] 
            if item["classifiers"][0]["subcategory"] == "County"]

This would give you the full dictionary for each county, if you are only interested in the "name" field you can use this:

counties = [item["name"] for item in data["features"]
            if item["classifiers"][0]["subcategory"] ==  "County"]

The JSON object you provided seemed to have a very consistent format, but if that is not always the case you may need to do some additional checking to make sure the dictionary keys are present.

like image 96
Andrew Clark Avatar answered Oct 28 '22 12:10

Andrew Clark