2017-01-05 62 views
1

我正在使用Giscloud的REST API來獲取json,並提供一些我需要的信息用於我的web應用程序。問題是,我可以使用相應的php函數從該json獲取和/或解碼任何數據,這似乎是不可能的。我認爲這與json文件的結構有關。無法從json文件中將數據提取到php變量中

這是JSON文件(某些字段編輯):

{ 
    "type": "maps", 
    "total": 3, 
    "page": 1, 
    "data": [ 
    { 
     "id": "edited", 
     "name": "Mapa de Mantención en Linea", 
     "owner": "edited", 
     "epsg": "900913", 
     "active": "1", 
     "copyright": "", 
     "proj4": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +no_defs", 
     "units": "meter", 
     "maxzoom": "0", 
     "mobileacess": "f", 
     "bgcolor": "#417893", 
     "wmsaccess": null, 
     "modified": 1483563460, 
     "accessed": 1483563460, 
     "created": 1483021672, 
     "description": "", 
     "maptype": null, 
     "assets": null, 
     "rating": "0", 
     "units_proj4": "meter", 
     "visited": "31", 
     "resource_id": "6102219", 
     "measure_unit": "meter", 
     "share": "f", 
     "bounds": " {\"xmin\":-8027875.3326789,\"xmax\":-7742459.4690621,\"ymin\":-4065685.5344885,\"ymax\":-3929474.7500843}" 
    }, 
    { 
     "id": "edited", 
     "name": "Mapa de Operaciones", 
     "owner": "edited", 
     "epsg": "900913", 
     "active": "1", 
     "copyright": "", 
     "proj4": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +no_defs", 
     "units": "meter", 
     "maxzoom": "0", 
     "mobileacess": "f", 
     "bgcolor": "#417893", 
     "wmsaccess": null, 
     "modified": 1483563473, 
     "accessed": 1483563473, 
     "created": 1483021672, 
     "description": "", 
     "maptype": null, 
     "assets": null, 
     "rating": "0", 
     "units_proj4": "meter", 
     "visited": "45", 
     "resource_id": "6102603", 
     "measure_unit": "meter", 
     "share": "f", 
     "bounds": "{\"xmin\":-8027263.8364526,\"xmax\":-7741847.9728358,\"ymin\":-4075469.474109,\"ymax\":-3939258.6897048}" 
    }, 
    { 
     "id": "edited", 
     "name": "Mapa M&IC", 
     "owner": "edited", 
     "epsg": "900913", 
     "active": "1", 
     "copyright": "", 
     "proj4": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +no_defs", 
     "units": "meter", 
     "maxzoom": "0", 
     "mobileacess": "f", 
     "bgcolor": "#417893", 
     "wmsaccess": null, 
     "modified": 1483563449, 
     "accessed": 1483563449, 
     "created": 1483021672, 
     "description": "", 
     "maptype": null, 
     "assets": null, 
     "rating": "0", 
     "units_proj4": "meter", 
     "visited": "35", 
     "resource_id": "6102604", 
     "measure_unit": "meter", 
     "share": "f", 
     "bounds": "{\"xmin\":-8028181.080792,\"xmax\":-7742765.2171752,\"ymin\":-4074552.2297696,\"ymax\":-3938341.4453654}" 
    } 
    ] 
} 

這些是我試圖解碼此JSON,放入一個變量的不同方式。

$json = curl_exec($ch); 

// Number 1 
$data = var_dump(json_decode($json)); 
echo $data['data'][0]['id']; 
exit; 

// Number 1 returns 
object(stdClass)[21] 
    public 'code' => string 'FATAL' (length=5) 
    public 'msg' => string 'Internal error' (length=14) 

// Number 2 
$data = json_decode($json,true); 
echo $data['data'][0]['id']; 

// Number 2 returns 
PHP Undefined index: data 

我試過其他幾個類似的函數,比如print_r。或者在這裏和這裏改變一些值,但沒有任何工作。

我將不勝感激這方面的一些幫助!

一些額外的信息:

  1. 有,捲曲沒有問題。它正確執行。
  2. 是的,服務器回答一個json文件。

UPDATE

  1. 使用json_last_error()(無需參數)我能debbug。該函數根據錯誤類型返回一個int值。我的是0,這意味着沒有錯誤。
  2. 我想我已經用盡了這個想法。
+0

JSON字符串驗證(使用'jsonlint.com') – RiggsFolly

+0

您的代碼返回'編輯'爲我,這是正確的。 –

+0

您解碼爲StdClass,但將該對象用作關聯數組... json_decode默認爲stdClass:請參閱** [此處的文檔](http://php.net/manual/en/function.json-decode .php)** – YvesLeBorg

回答

2

鬆動var_dump()那只是用於調試,它是從json_decode()返回一個PHP對象stoppping的json_decode()

然後使用正確的對象語法來解決對象

$json = curl_exec($ch); 

$data = json_decode($json); 
// debug code 
if (json_last_error() > 0) { 
    echo json_last_error_msg(); 
} else 
    // this should print the data structure 
    print_r($data); 
} 
// end debug code 

echo $data->data[0]->id; 

如果你想來自所有occurances的id的,你可以做

$json = curl_exec($ch); 

$data = json_decode($json); 
foreach ($data->data as $idx => $obj){ 
    echo "Occurance $idx = " . $obj->id; 
} 
+0

我試過了你的第一個例子。它引發了這個錯誤: '未定義的屬性:stdClass :: $ data' 似乎我認爲'json_decode()'在進程中對json中的對象屬性做了一些事情,比如修改它們的名字或其他東西,因爲當迴應我想要的價值似乎不知道該價值存在。 –

+0

好吧我正在檢查我沒有犯一個愚蠢的錯誤 – RiggsFolly

+0

順便說一句:我使用WAMP服務器,並且既然你是一個Wamp用戶也不能缺少PHP擴展? –

0

對象語法:

$json = curl_exec($ch); 

$json_data = json_decode($json); 

foreach ($json_data->data as $data_item){ 
    echo '<p>ID: ' . $data_item->id . ' -- Name: ' . $data_item->name . '</p>'; 
    } 

陣列語法:

通過添加第二參數TRUE到json_decode()獲得的數據作爲一個相關聯的陣列php docs

$json = curl_exec($ch); 

$data_array = json_decode($json, true); 

foreach ($data_array['data'] as $item){ 
    echo '<p>ID: ' . $item['id'] . ' -- Name: ' . $item['name'] . '</p>'; 
    } 
0

我不優選使用捲曲在這種情況下,可以使用

file_get_contents 

所以這裏是一個簡單的代碼

$userdata = json_decode(file_get_contents("JSON_URL_GOES_HERE"), true) 
$u_ID = $userdata['data'][0]['id']; 

等 請參閱:file_get_contents

+0

我需要使用cURL。我有一個API密鑰。 –

+0

你可以使用你的API密鑰完整的網址,並獲得相同的數據,這很容易! –