Search code examples
phpjsoncurljson-deserialization

Impossible to fetch data from a json file into php variable


I'm using Giscloud's REST API to grab a json with some info that i need for my web app. The problem is that it seems impossible that I can fetch and/or decode any data from that json using the corresponding php functions. I think it has something to do with the way the json file is structured.

This is the json file (some fields edited):

{
  "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}"
    }
  ]
}

These are the different ways that i've tried to decode this json and put it into a variable.

$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

I've tried several other similar functions, like print_r. Or change some values there and here, but nothing has worked.

I would appreciate a lot some help on this!

Some extra info:

  1. There's no problem with curl. It executes correctly.
  2. Yes, the server answers with a json file.

UPDATE

  1. Using json_last_error() (no need of parameters) I was able to debbug. The function returns an int depending of the type of error. Mine was 0meaning that there's no error.
  2. I think I ran out of ideas for this.

Solution

  • Loose the var_dump() thats just for debugging and it is stoppping the json_decode() from returning a PHP Object from the json_decode().

    Then use the correct object syntax to address the object

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

    If you want all the id's from all the occurances you can do

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