我有以下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,为什么?
感谢。
答案 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'};