¿Cómo puedo extraer datos de JSON con PHP?


Esta es una pregunta y respuesta de referencia general que cubre muchos de los interminables "¿Cómo puedo acceder a los datos en mi JSON?" preguntas. Está aquí para manejar los conceptos básicos generales de decodificación JSON en PHP y el acceso a los resultados.

Tengo el JSON:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

¿Cómo puedo decodificar esto en PHP y acceder a los datos resultantes?

 153
Author: Paul Crovella, 2015-03-27

2 answers

Intro

Primero tienes una cadena. JSON no es una matriz, un objeto o una estructura de datos. JSON es un formato de serialización basado en texto, por lo que es una cadena elegante, pero sigue siendo solo una cadena. Decodificarlo en PHP usando json_decode().

 $data = json_decode($json);

Allí se puede encontrar: {[40]]}

Estas son las cosas que se pueden codificar en JSON. O más exactamente, estas son las versiones de PHP de las cosas que se pueden codificar en JSON.

No hay nada especial en ellos. Ellos no son "objetos JSON" o "matrices JSON."Has decodificado el JSON-ahora tienes tipos básicos de PHP cotidianos.

Los objetos serán instancias de stdClass , una clase integrada que es solo una cosa genérica que no es importante aquí.


Acceso a las propiedades del objeto

Accede a las propiedades de uno de estos objetos de la misma manera que lo haría con las propiedades no estáticas públicas de cualquier otro objeto, por ejemplo, $object->property.

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

Acceso a elementos de matriz

Usted accede a los elementos de una de estas matrices de la misma manera que lo haría con cualquier otra matriz, p.ej. $array[0].

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

Iterar sobre él con foreach.

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

Glaseado
Chocolate con chispas
Maple

O meterse con cualquiera de las bazillion funciones de array integradas.


Acceso a elementos anidados

Las propiedades de los objetos y los elementos de los arrays pueden ser más objetos y / o arrays-simplemente puede continuar accediendo a sus propiedades y miembros como habitual, por ejemplo, $object->array[0]->etc.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004

Pasar true como segundo argumento a json_decode()

Al hacer esto, en lugar de objetos obtendrá arrays asociativos - arrays con cadenas para claves. Una vez más se accede a los elementos de la misma como de costumbre, por ejemplo, $array['key'].

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple

no sé cómo se estructuran los datos

Lea la documentación de lo que sea que esté obteniendo el JSON.

Mira el JSON-donde ver corchetes {} esperar un objeto, donde se ve corchetes [] esperar una matriz.

Golpear los datos decodificados con una print_r():

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

print_r($yummy);

Y compruebe la salida:

stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )

            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )

            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )

        )

)

Te dirá dónde tienes objetos, dónde tienes matrices, junto con los nombres y valores de sus miembros.

Si solo puedes llegar hasta cierto punto antes de perderte, ve hasta ese punto y golpea eso con print_r():

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

Romper el problema abajo en pedazos que son más fáciles de envolver su cabeza alrededor.


json_decode() regresos null

Esto sucede porque:

  1. El JSON consiste enteramente en eso, null.
  2. El JSON no es válido-compruebe el resultado de json_last_error_msg o ponlo a través de algo como JSONLint .
  3. Contiene elementos anidados a más de 512 niveles de profundidad. Esta profundidad máxima predeterminada se puede sobrescribir pasando un entero como el tercer argumento para json_decode().

Si necesita cambiar la profundidad máxima, probablemente esté resolviendo el problema equivocado. Averigüe por qué está obteniendo datos tan profundamente anidados (por ejemplo, el servicio que está consultando que está generando el JSON tiene un error) y consiga que eso no suceda.


El nombre de la propiedad del objeto contiene un carácter especial

A veces tendrá un nombre de propiedad de objeto que contiene algo así como un guion - o en el signo @ que no se puede utilizar en un identificador literal. En su lugar, puede usar un literal de cadena dentro de llaves para dirigirlo.

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

Si tiene un entero como propiedad, consulte: ¿Cómo acceder a las propiedades de los objetos con nombres como enteros? como referencia.


Alguien puso JSON en tu JSON

Es ridículo, pero sucede - hay JSON codificado como una cadena dentro de su JSON. Decodificar, acceder a la cadena como de costumbre, decodificar que, y finalmente consigue lo que necesitas.

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

los Datos no caben en la memoria

Si su JSON es demasiado grande para json_decode() para manejar a la vez las cosas comienzan a ponerse complicadas. Véase:


Cómo ordenarlo

Ver: Referencia: todas las formas básicas de ordenar arrays y datos en PHP.

 306
Author: Paul Crovella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-22 23:00:09

Puede usar json_decode() para convertir una cadena json a un objeto/array PHP.

Eg.

Entrada:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

Salida:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

Algunos puntos para recordar:

  • json_decode requiere que la cadena sea un json válido de lo contrario devolverá NULL.
  • En caso de fallo en la decodificación, json_last_error() se puede utilizar para determinar la naturaleza exacta del error.
  • Asegúrese de pasar en utf8 contenido, o json_decode puede generar un error y devolver un valor NULL.
 8
Author: Mohd Abdul Mujib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-26 13:24:54