2014-03-01 44 views
0

我想創建一個數組json_encode它,然後通過echo發送它。該陣列需要從以下服務器響應我從外部API獲得創建:如何從API調用返回的JSON對象中訪問數據?

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

貌似API將返回JSONP響應。 – palanik

+0

這是'JSONP',而不是'JSON'。它可以通過'json_decode'直接解碼。你必須從這個'JSONP'響應手動拉'JSON' – hindmost

+0

Checkout [解壓php中的jsonp](http://stackoverflow.com/questions/5081557/extract-jsonp-resultset-in-php/5081588#5081588) – palanik

回答

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 
) 
+0

謝謝!我一直使用JSON,但之前從未聽說過JSONP。 –

0

像這樣的服務器回覆是JSONP。您以特定方式從客戶端訪問類似API的API,這需要了解JSONP內部知識。使用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); 
    } 
}); 

您的數據將自動在'success'回調中的'data'變量中可用。

我鼓勵您在完成當前項目後查看JSONP內部結構。這是一個非常有趣的解決方法,你可以用它做更多的事情。

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

相關問題