2017-01-05 5 views
1

Я использую API REST Giscloud для захвата json с некоторой информацией, которая мне нужна для моего веб-приложения. Проблема в том, что кажется невозможным, что я могу извлекать и/или декодировать любые данные из этого json, используя соответствующие php-функции. Я думаю, что это имеет какое-то отношение к тому, как структурирован 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() вот только для отладки и он stoppping в json_decode() от возвращения PHP Object из 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; 

Если вы хотите, чтобы все id «s из всех появлений вы можете сделать

$json = curl_exec($ch); 

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

Я попытался с вашим первым примером. Это порождает мне эту ошибку: 'Undefined property: stdClass :: $ data' Мне кажется, что' json_decode() 'что-то делает с объектными свойствами в json в proccess, например, модифицирует их имя или что-то еще, потому что когда эхо значение, которое я хочу, похоже, не имеет понятия, что это значение существует. –

+0

Хорошо, я проверяю, что я не сделал глупую ошибку. – RiggsFolly

+0

BTW: Я использую WAMP Server, а так как вы тоже пользователь 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

я не предпочтительней использовать CURL В этой ситуации, вы можете использовать

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

вы можете использовать полный url с вашим ключом api и получить те же данные, это легко! –