我想创建一个数组json_encode
,然后通过echo
将其发送出去。需要从我从外部API获得的以下服务器响应创建数组:
someName([{"lat":"35.7804015","lon":"-78.6390779"}])
我想做这样的事情:
$lat = someName['lat']; // this doesn't work
$lon = someName['lon']; // this doesn't work
$data = array('lat'=> $lat, 'lon'=> $lon);
echo json_encode($data);
问题是我没有从“someName”获取数据。我做错了什么?
答案 0 :(得分:1)
您在这里正在处理JSONP。它基本上是一个完整的函数调用而不是原始数据,所以你必须从字符串中提取所需的部分:
$response = 'someName([{"lat":"35.7804015","lon":"-78.6390779"}])';
$jsonString = substr($response, 10, -2); // 10 = length of 'someName(['
$dataArray = json_decode($jsonString, true);
echo $dataArray['lat']; // 35.7804015
echo $dataArray['lat']; // -78.6390779
现在您将数据存储在一个数组中,并且可以按照您在示例中尝试的方式访问它:
print_r($dataArray);
<强>输出:强>
Array
(
[lat] => 35.7804015
[lon] => -78.6390779
)
答案 1 :(得分:0)
这样的服务器响应是JSONP。您可以通过需要了解JSONP内部的特定方式从客户端访问类似API的API。使用JSONP的原因是为了解决跨源限制。
一个快捷方式是使用像jQuery这样的库来为你抽象JSONP。 ajax方法具有易于使用的JSONP数据类型。这是一个例子:
$.ajax({
type: 'GET',
url: 'https://someapiendpoint.com/v1/',
dataType: 'jsonp',
success: function(data) {
console.log(data);
},
error: function(e) {
console.log(e.message);
}
});
您的数据将自动显示在“成功”回调中的“数据”变量中。
我鼓励您在当前项目完成后查看JSONP内部。这是一个非常有趣的解决方法,你可以用它做更多的事情。
答案 2 :(得分:0)
这看起来像jsonp响应,这实际上是为了绕过客户端JavaScript环境中的SOP 您应该检查api以查看它是否支持JSON响应并使用json_decode 如果没有,您将不得不从响应中提取数据。
$json = preg_replace('/(.+\()|(\)$)/', '', $responseString);
$data = json_decode($json, true);
echo json_encode(array('lat'=> $data[0]['lat'], 'lon'=> $data[0]['lon']));