【问题标题】:PHP and JSON from Openstreetmap searchOpenstreetmap 搜索中的 PHP 和 JSON
【发布时间】:2015-12-30 10:43:24
【问题描述】:

我正在尝试使用 Openstreetmap 和 PHP 来指向地图上的一个地方。 正如您在下面看到的,我检索了一个 JSON 数组,但 PHP 返回了一个 NULL 值

请注意,我的$url 是一个有效的 JSON(您可以检查它here)。

<?
$url = 'http://nominatim.openstreetmap.org/search/Piazza%20Duomo%20Trento?format=json&addressdetails=1&limit=1&polygon_svg=1';
$html = file_get_contents($url);
$jsonout = json_decode($html);
echo $jsonout[0];
?>

我做错了什么?

【问题讨论】:

  • 你正在尝试echo 对象,为什么它给出了 NULL

标签: php json null openstreetmap


【解决方案1】:

我做错了什么?

首先,您的开始标签不正确:

<? ----> <?php

那么,你不能echo 这样的数组。在您的阵列上使用var_dump 来查看结构。

当我尝试使用您的代码进行更正时,我得到了这个:

array (size=1)


0 => 
    object(stdClass)[1]
      public 'place_id' => string '8577656' (length=7)
      public 'licence' => string 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright' (length=84)
      public 'osm_type' => string 'node' (length=4)
      public 'osm_id' => string '924463183' (length=9)
      public 'boundingbox' => 
        array (size=4)
          0 => string '46.0675164' (length=10)
          1 => string '46.0676164' (length=10)
          2 => string '11.1217498' (length=10)
          3 => string '11.1218498' (length=10)
      public 'lat' => string '46.0675664' (length=10)
      public 'lon' => string '11.1217998' (length=10)
      public 'display_name' => string 'Piazza Duomo, Piazza del Duomo, centro storico Trento, Trento, TN, TAA, 38122, Italia' (length=85)
      public 'class' => string 'highway' (length=7)
      public 'type' => string 'bus_stop' (length=8)
      public 'importance' => float 0.311
      public 'icon' => string 'http://nominatim.openstreetmap.org/images/mapicons/transport_bus_stop2.p.20.png' (length=79)
      public 'address' => 
        object(stdClass)[2]
          public 'bus_stop' => string 'Piazza Duomo' (length=12)
          public 'pedestrian' => string 'Piazza del Duomo' (length=16)
          public 'suburb' => string 'centro storico Trento' (length=21)
          public 'city' => string 'Trento' (length=6)
          public 'county' => string 'TN' (length=2)
          public 'state' => string 'TAA' (length=3)
          public 'postcode' => string '38122' (length=5)
          public 'country' => string 'Italia' (length=6)
          public 'country_code' => string 'it' (length=2)
      public 'svg' => string 'cx="11.1217998" cy="-46.067566399999997"' (length=40)

【讨论】:

  • var_dump($jsonout[0]); 和类似的var_dump($jsonout[0]['lat']); 都返回NULL
  • 这很奇怪,this code 为我工作。也许您的配置或网络有问题。但这不是 PHP 的问题。
  • 我开始认为我的提供商正在阻止这种类型的程序。 PHP 应该可以正常工作。
  • 我怀疑您的 ISP 是否阻止了这种事情。也许您应该尝试以其他方式获取 JSON。以curl 为例。
  • 我的 ISP 有一个限制。我终于可以解封了。
【解决方案2】:

回答您的问题,除了尝试使用以下语句输出数组

echo $jsonout[0];

这会抛出一个Catchable fatal error: Object of class stdClass could not be converted to string

一切正常。

如果这是关于访问json_decode 返回的成员,请参见下文

$jsonout 是一个只有一个元素的数组,
一个元素是一个对象,你可以像这样访问它的成员

print $jsonout[0]->licence;

哪个会输出

Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright

如果你想要一个关联数组,你可以传递json_decode 的第二个参数,像这样

$jsonout = json_decode($html,true);
print $jsonout[0]['display_name'];

这会将 json 解码为关联数组并以类似的方式显示

Piazza Duomo, Piazza del Duomo, centro storico Trento, Trento, TN, TAA, 38122, Italia

【讨论】:

  • 还是什么都没有。 var_dump($jsonout[0]['display_name']); 为 NULL。
  • 它是一个对象数组,所以你需要使用var_dump($jsonout[0]-&gt;display_name);
  • 使用var_dump($jsonout[0]-&gt;display_name); 也会返回NULL
  • 循序渐进,在json_decode 之后立即执行var_dump($jsonout); 并使用输出编辑您的问题
【解决方案3】:

请使用 print_r() 代替 echo

$url = "http://nominatim.openstreetmap.org/search/Piazza%20Duomo%20Trento?format=json&addressdetails=1&limit=1&polygon_svg=1";
$html = file_get_contents($url);
$jsonout = json_decode($html);
print_r($jsonout[0]);

你会得到你的结果。

【讨论】:

    【解决方案4】:

    或者你可以打印$jsonout[0]["license"]

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 2011-02-23
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多