Introducción
Primero tienes una cuerda. 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. Descifrarlo en PHP mediante el uso json_decode()
.
$data = json_decode($json);
Ahí puedes encontrar:
Estas son las cosas que se pueden codificar en JSON. O más exactamente, estas son versiones de PHP de las cosas que se pueden codificar en JSON.
No hay nada especial en ellos. No son "objetos JSON" o "matrices JSON". Has decodificado el JSON, ahora tienes tipos básicos de PHP para todos los días .
Los objetos serán instancias de stdClass , una clase incorporada que es simplemente una cosa genérica que no es importante aquí.
Accediendo a las propiedades del objeto
Accede a las propiedades de uno de estos objetos de la misma manera que lo haría para las propiedades públicas no estáticas 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 la matriz
Accede a los elementos de una de estas matrices de la misma manera que lo haría con cualquier otra matriz, por ejemplo $array[0]
.
$json = '
[
"Glazed",
"Chocolate with Sprinkles",
"Maple"
]';
$toppings = json_decode($json);
echo $toppings[1]; //Chocolate with Sprinkles
Iterar sobre ello con foreach
.
foreach ($toppings as $topping) {
echo $topping, "\n";
}
Chocolate Glaseado con Rociado de
Arce
O juegue con cualquiera de las funciones de matriz integradas de bazillion .
Acceder a elementos anidados
Las propiedades de los objetos y los elementos de las matrices pueden ser más objetos y / o matrices; simplemente puede continuar accediendo a sus propiedades y miembros como de costumbre, 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
Pasando true
como segundo argumento a json_decode ()
Cuando haces esto, en lugar de objetos obtendrás matrices asociativas, matrices con cadenas para claves. De nuevo accede a los elementos de los mismos 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
Acceso a elementos de matriz asociativa
Al decodificar un objeto JSON en una matriz PHP asociativa, puede iterar tanto claves como valores utilizando la foreach (array_expression as $key => $value)
sintaxis, por ejemplo
$json = '
{
"foo": "foo value",
"bar": "bar value",
"baz": "baz value"
}';
$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
echo "The value of key '$key' is '$value'", PHP_EOL;
}
Huellas dactilares
El valor de la clave 'foo' es 'valor de foo'
El valor de la clave 'bar' es 'valor de barra'
El valor de la clave 'baz' es 'valor baz'
No sé cómo se estructuran los datos.
Lea la documentación de lo que sea que esté obteniendo el JSON.
Mire el JSON: donde ve que los corchetes {}
esperan un objeto, donde ve que los corchetes []
esperan una matriz.
Golpee los datos decodificados con un 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 verifique 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
)
)
)
Le dirá dónde tiene objetos, dónde tiene matrices, junto con los nombres y valores de sus miembros.
Si solo puede llegar tan lejos antes de perderse, vaya tan lejos y golpee eso con print_r()
:
print_r($yummy->toppings[0]);
stdClass Object
(
[id] => 5002
[type] => Glazed
)
Echa un vistazo en este práctico explorador interactivo JSON .
Divide el problema en pedazos que sean más fáciles de entender.
json_decode()
devoluciones null
Esto sucede porque:
- El JSON consiste completamente en eso
null
,.
- El JSON no es válido: verifique el resultado
json_last_error_msg
o póngalo en algo como JSONLint .
- Contiene elementos anidados más de 512 niveles de profundidad. Esta profundidad máxima predeterminada puede anularse pasando un número entero como tercer argumento a
json_decode()
.
Si necesita cambiar la profundidad máxima, probablemente esté resolviendo el problema incorrecto. Descubra por qué está obteniendo datos tan anidados (por ejemplo, el servicio que está consultando que genera el JSON tiene un error) y haga 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 como un guión -
o un signo @
que no se puede usar en un identificador literal. En su lugar, puede usar un literal de cadena entre llaves para abordarlo.
$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. Decodifique, acceda a la cadena como de costumbre, decodifique eso y, finalmente, obtenga lo que necesita.
$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()
manejarlo de inmediato, las cosas comienzan a complicarse. Ver:
Cómo ordenarlo
Ver: Referencia: todas las formas básicas de ordenar matrices y datos en PHP .