使用Google Refine从Google Maps API JSON提取邮政编码

使用Google Refine从Google Maps API JSON提取邮政编码,json,google-maps,postal-code,google-refine,Json,Google Maps,Postal Code,Google Refine,我正在尝试使用GoogleRefine从GoogleMapsAPI JSON中提取邮政编码 我通过获取URL添加了一个新列: ”http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=“+转义(值,“url”) 然后生成的JSON如下所示: { "results" : [ { "address_components" : [ { "long_name" : "44", "short_name" : "44", "

我正在尝试使用GoogleRefine从GoogleMapsAPI JSON中提取邮政编码

我通过获取URL添加了一个新列:

”http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=“+转义(值,“url”)

然后生成的JSON如下所示:

{ "results" : [ { "address_components" : [ { "long_name" : "44", "short_name" : "44", "types" : [ "street_number" ] }, { "long_name" : "Homer Street", "short_name" : "Homer St", "types" : [ "route" ] }, { "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" : "W1H 4NW", "short_name" : "W1H 4NW", "types" : [ "postal_code" ] }, { "long_name" : "London", "short_name" : "London", "types" : [ "postal_town" ] } ], "formatted_address" : "44 Homer Street, London, Greater London W1H 4NW, UK", "geometry" : { "location" : { "lat" : 51.51981750, "lng" : -0.16534040 }, "location_type" : "ROOFTOP", "viewport" : { "northeast" : { "lat" : 51.52116648029151, "lng" : -0.1639914197084980 }, "southwest" : { "lat" : 51.51846851970851, "lng" : -0.1666893802915020 } } }, "types" : [ "street_address" ] } ], "status" : "OK" }
在浏览了一些博客以查找相关代码后,我尝试使用以下内容转换该专栏

value.parseJson().results[0]["formatted_address"]
…这对于完整的地址非常有用

当我试图提取邮政编码时,问题就出现了。我试着四处摆弄,结果一无所获,然后我下载了JSONPad并将JSON粘贴到树映射中以获得路径:

value.parseJson().results[0]["address_components"][5]["long_name"]
问题是,对于某些条目,它可以完美地提取邮政编码,而对于其他条目,它提取的邮政编码就不那么完美了,比如城镇或国家

将[5]更改为[6]似乎可以提取其他地址的邮政编码,但是否有办法仅提取邮政编码,而不管它在结构中的位置如何


非常感谢任何帮助

您可能需要在address\u components数组中的结构上循环,检查每个结构的“类型”。当类型包含“邮政编码”时,tada就是你的邮政编码

类似于以下代码(对我有效):


变量stuData=
{
“结果”:[{
“地址组件”:[{
“long_name”:“44”,
“短名称”:“44”,
“类型”:[“街道编号”]
}, {
“long_name”:“荷马街”,
“短名称”:“荷马街”,
“类型”:[“路线”]
}, {
“long_名称”:“伦敦”,
“短名称”:“伦敦”,
“类型”:[“地区”、“政治”]
}, {
“long_名称”:“大伦敦”,
“短名称”:“Gt Lon”,
“类型”:[“行政区\级别\ 2”,“政治”]
}, {
“long_名称”:“英国”,
“短名称”:“GB”,
“类型”:[“国家”、“政治”]
}, {
“long_名称”:“W1H 4NW”,
“短名称”:“W1H 4NW”,
“类型”:[“邮政编码”]
}, {
“long_名称”:“伦敦”,
“短名称”:“伦敦”,
“类型”:[“邮政镇”]
}
],
“地址”:“英国大伦敦霍默街44号W1H 4NW”,
“几何学”:{
“地点”:{
“lat”:51.51981750,
“液化天然气”:-0.16534040
},
“位置类型”:“屋顶”,
“视口”:{
“东北”:{
“lat”:51.52116648029151,
“液化天然气”:-0.1639914197084980
},
“西南”:{
“lat”:51.51846851970851,
“液化天然气”:-0.1666893802915020
}
}
},
“类型”:[“街道地址”]
}
],
“状态”:“确定”
};
我的邮政编码;
对于(var i=0;i
您可以将duncan的答案从Javascript翻译成Python,并与Jython解释器一起使用,也可以使用以下GREL表达式(我在Google Groups上发布了该表达式以响应您的查询):

过滤器(forEach(value.parseJson().results[0]。地址\u组件,c,if(c.types[0]=='postal\u code',c.long\u name',),v,v!='')[0]


当然,所有这些都假定您正在使用这些数据,按照API的服务条款在谷歌地图上显示。

谢谢,但请原谅——我如何将其纳入谷歌地图?我是否需要用您的代码替换“通过获取URL添加列”列的结果,然后使用相同的。。。value.parseJson().results[0][“address_components”][5][“long_name”]…处理过程与以前一样?抱歉,我不熟悉Google Refine。在我提到stuData的地方,您可能只需要使用
value.parseJson()
例如
I
<script type="text/javascript">
var stuData = 
{
    "results": [{
            "address_components": [{
                    "long_name": "44",
                    "short_name": "44",
                    "types": ["street_number"]
                }, {
                    "long_name": "Homer Street",
                    "short_name": "Homer St",
                    "types": ["route"]
                }, {
                    "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": "W1H 4NW",
                    "short_name": "W1H 4NW",
                    "types": ["postal_code"]
                }, {
                    "long_name": "London",
                    "short_name": "London",
                    "types": ["postal_town"]
                }
            ],
            "formatted_address": "44 Homer Street, London, Greater London W1H 4NW, UK",
            "geometry": {
                "location": {
                    "lat": 51.51981750,
                    "lng": -0.16534040
                },
                "location_type": "ROOFTOP",
                "viewport": {
                    "northeast": {
                        "lat": 51.52116648029151,
                        "lng": -0.1639914197084980
                    },
                    "southwest": {
                        "lat": 51.51846851970851,
                        "lng": -0.1666893802915020
                    }
                }
            },
            "types": ["street_address"]
        }
    ],
    "status": "OK"
};

var myPostcode;

for (var i = 0; i < stuData.results[0].address_components.length; i++) {
    for (var j = 0; j < stuData.results[0].address_components[i].types.length; j++) {
        if (stuData.results[0].address_components[i].types[j] == "postal_code") {
            myPostcode = stuData.results[0].address_components[i].long_name;
            break;
        }
    }
}

console.log(myPostcode);
</script>