PHP中的简单JSON请求

时间:2012-03-29 17:32:19

标签: php file-get-contents json

我有以下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,为什么?

感谢。

7 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:4)

您正在使用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本身。将您的网址更改为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()函数中。

答案 2 :(得分:0)

该网站不会返回纯JSON,而是包含JSON。这应该包含在脚本中,并将调用回调函数。如果你想使用它,你首先需要删除函数调用(直到第一个paranthesis的部分和最后的paranthesis)。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

您正在返回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的解决方案看起来更好,只是请求正确的数据,而不是搞乱不正确的数据。

答案 5 :(得分:0)

如果您的json中包含country_code(以及右括号,请将其删除。 这不是有效的json语法:json

答案 6 :(得分:0)

显然在这种情况下,使用正确的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'};