PHP中的简单JSON请求


Simple JSON request in PHP

我有以下json

country_code({"latitude":"45.9390","longitude":"24.9811","zoom":6,"address":{"city":"-","country":"Romania","country_code":"RO","region":"-"}})

我只想要country_code,我该如何解析它?

我有这个代码

<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = file_get_contents($json);
var_dump(json_decode($jsonfile));
?>

它返回NULL,为什么?

谢谢。

<?php
$jsonurl = "http://api.wipmania.com/json";
$json = file_get_contents($jsonurl);
var_dump(json_decode($json));
?>

你只需要json而不是jsonp
如果要返回数组,也可以尝试使用json_decode($json, true)

您正在使用http://api.wipmania.com/jsonp?callback=jsonpCallback请求jsonp,它返回一个包含JSON的函数,如:

jsonpCallback({"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}})

而不是JSON本身。将您的URL更改为http://api.wipmania.com/json以返回纯JSON类:

{"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}}

请注意,第二块代码没有将json封装在jsonpCallback()函数中。

网站不返回纯JSON,而是返回包装的JSON。这意味着作为脚本包含,并将调用回调函数。如果你想使用它,你首先需要删除函数调用(直到第一个副题的部分和最后的副题)。

如果您的服务器实现JSONP,它将假设回调参数是JSONP信号,结果将类似于JavaScript函数,如

jsonpCallback("{yada: 'yada yada'}")

然后,json_decode将无法将jsonpCallback("{yada: 'yada yada'}")解析为有效的JSON字符串

如果json中包含country_code(和右括号,请删除它们。这不是一个有效的json语法:json

返回的是JSONP,而不是JSON。JSONP用于JavaScript中的跨域请求。使用PHP时不需要使用它,因为您不受跨域策略的影响。

由于您从file_get_contents()函数中获得一个字符串,因此可以替换country_code(文本(这是响应的JSONP特定部分):

<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = substr(file_get_contents($json)), 13, -1);
var_dump(json_decode($jsonfile));
?>

备注

这是有效的,但JKirchartz的解决方案看起来更好,只需要请求正确的数据,而不是处理不正确的数据。

显然,在这种情况下,使用正确的URL访问API将返回纯jSON。

"http://api.wipmania.com/json"

很多人在使用中提供了API的替代方案,而不是回答OP的问题,因此这里有一个解决方案,供那些正在寻找在PHP中处理jSONp的方法的人使用。

首先,API允许您指定一个回调方法,因此您可以使用Jasper的方法来获取jSON子字符串,或者您可以给出一个jSON_decode的回调方法,并修改结果以与eval调用一起使用。这是我对Jasper代码示例的替代,因为我不喜欢成为一个复制猫:

$json = "http://api.wipmania.com/jsonp?callback=json_decode";
$jsonfile eval(str_replace("(", "('", str_replace(")", "')", file_get_contents($json)))));
var_dump($jsonfile);

诚然,这似乎有点长,更不安全,读起来不像Jasper的代码那样清晰:

$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = substr(file_get_contents($json)), 13, -1);
var_dump(json_decode($jsonfile));

然后jSON "address":{"city":"-","country":"Romania","country_code":"RO","region":"-"}告诉我们访问country_code,如下所示:

$jsonfile->{'address'}->{'country_code'};