无法将 json 文件中的数据提取到 php 变量中

Impossible to fetch data from a json file into php variable

我正在使用 Giscloud 的 REST API 获取 json 以及我的网络应用程序所需的一些信息。问题是我似乎不可能使用相应的 php 函数从 json 中获取 and/or 解码任何数据。我认为这与 json 文件的结构方式有关。

这是 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 +nadgrids=@null +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 +nadgrids=@null +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 +nadgrids=@null +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. curl 没有问题。它正确执行。
  2. 是的,服务器用 json 文件回答。

更新

  1. 使用json_last_error()(不需要参数)我能够调试。函数 returns 一个 int 取决于错误的类型。我的是0意思是没有错误。
  2. 我想我 运行 对此一无所知。

松开仅用于调试的 var_dump(),它会阻止 json_decode()json_decode().

返回 PHP 对象

然后使用正确的对象语法来寻址对象

$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 的所有事件,您可以做到

$json = curl_exec($ch);

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

对象语法:

$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>';
  }

数组语法:

通过向 json_decode() 添加第二个参数 TRUE 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>';
  }

我不喜欢使用 cURL 在这种情况下,您可以使用

file_get_contents 

所以这是一个简单的代码

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

等等 见:file_get_contents