如何从API调用返回的JSON对象中访问数据?

时间:2014-03-01 18:58:44

标签: php json

我想创建一个数组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”获取数据。我做错了什么?

3 个答案:

答案 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']));

http://codepad.org/CIg6i8tx