我有以下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'};