【问题标题】:JSON loop though Google geocode address_components with Perl使用 Perl 通过 Google 地理编码 address_components 的 JSON 循环
【发布时间】:2013-02-10 00:23:06
【问题描述】:

我编写了一个脚本来使用 perl 和 json 从谷歌地理编码器中获取一些信息。下面的示例使用机场缩写获取地址信息。

use JSON;
use LWP::Simple;

my $geo_url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=PHL";

my $response = get($geo_url);
my $json = decode_json($response);

my $location = $json->{results}[0]->{geometry}->{location};
my $address  = $json->{results}[0]->{formatted_address};

print "<br />Latitude: ".$location->{lat}." Longiude: ".$location->{lng};
print "<br />Address: ".$address;

我可以使用以下方法获取 address_component 数组的各个部分:

$json->{results}[0]{address_components}[0]->{short_name};
$json->{results}[0]{address_components}[1]->{short_name};

但我真正想做的是获取城市、州和邮政编码(postal_code)。为此,我需要遍历 address_components 并运行如下内容:

for (keys $json->{results}[0]{address_components}) {
  if ($json->{results}[0]{address_components}[$i]->types[0] eq "postal_code") {
    print "Zip: ".$json->{results}[0]{address_components}[$i]->{short_name};
    }
  }

显然这不是有效的代码,但我想解释一下我想要做什么。这是我无法工作的循环。我尝试了很多配置,即使数组项长度为 6,我仍然得到数组长度为 1。

【问题讨论】:

    标签: json perl google-maps google-geocoder


    【解决方案1】:

    基于

    $json->{results}[0]{address_components}[0]->{shortname};
    $json->{results}[0]{address_components}[1]->{shortname};
    

    $json-&gt;{results}[0]{address_components} 持有对数组的引用。虽然从技术上讲,您可以在数组引用上调用 keys 以获取最新版本的 Perl 中的索引列表,但在这种情况下(以及大多数其他情况)获取数组元素列表更简单。

    for my $address_component (@{ $json->{results}[0]{address_components} }) {
        if ( $address_component->{types}[0] eq "postal_code") {
           print "Zip: $address_component->{shortname}\n";
        }
    }
    

    查看所有类型可能会更好。

    for my $address_component (@{ $json->{results}[0]{address_components} }) {
        if (grep { $_ eq "postal_code" } @{ $address_component->{types} }) {
           print "Zip: $address_component->{shortname}\n";
        }
    }
    

    【讨论】:

    • 谢谢,效果很好。如果有人想使用此解决方案,您可能需要将 shortname 更改为 short_name 以与 Google 地理编码器输出兼容。那是我在原始问题中的错误。
    猜你喜欢
    • 2011-11-29
    • 2011-07-14
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多