¿Cómo extraigo datos de JSON con PHP?

214

Se pretende que sea una pregunta y respuesta de referencia general que cubra muchos de los interminables "¿Cómo accedo a los datos en mi JSON?" preguntas Está aquí para manejar los conceptos básicos generales de decodificar JSON en PHP y acceder 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 decodifico esto en PHP y accedo a los datos resultantes?

usuario3942918
fuente
1
Relacionado: Capaz de ver una variable en la salida de print_r (), pero no estoy seguro de cómo acceder a ella en código , aquí es posible la exploración interactiva de JSON en contexto de PHP: array.include-once.org
hakre
¿Puedo saber por qué esta pregunta no se considera como una pregunta duplicada, incluso 9 o menos usuarios marcados como duplicados para stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
Soy la persona más estúpida el
@IamtheMostStupidPerson Intentaré explicarlo, a pesar de que su nombre de usuario me hace dudar de que lo obtendrá;). Esta pregunta se hace y sus respuestas se escriben de manera "canónica". Como tal, es un mejor receptor para el objetivo duplicado que las otras preguntas.
Félix Gagnon-Grenier

Respuestas:

428

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 truecomo 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:

  1. El JSON consiste completamente en eso null,.
  2. El JSON no es válido: verifique el resultado json_last_error_msgo póngalo en algo como JSONLint .
  3. 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 .

usuario3942918
fuente
simplemente tropecé con esta respuesta y descubrí que el enlace a array.include-once.org está roto.
Jeff
@ Jeff Gracias. Lástima de eso. He eliminado el enlace.
usuario3942918
Sí, considerando el nombre del enlace y cómo lo has descrito, suena como un verdadero fastidio.
Jeff
Lo único que le falta a esta solución es cómo extraer datos de otro archivo json. Recomendaría esta solución: stackoverflow.com/questions/19758954/…
Ishan Srivastava
Esto es genial. Gracias.
David Kariuki
17

Puede usar json_decode () para convertir una cadena json en un objeto / matriz PHP.

P.ej.

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)
}

Pocos puntos para recordar:

  • json_decoderequiere que la cadena sea válida; de lo jsoncontrario, volverá NULL.
  • En el caso de una falla en la decodificación, json_last_error()puede usarse para determinar la naturaleza exacta del error.
  • Asegúrese de pasar el utf8contenido, o json_decodepuede generar un error y simplemente devolver un NULLvalor.
Mohd Abdul Mujib
fuente
bueno, quizás no les haya gustado su simplicidad, sin embargo. Siempre puedes votar;)
Mohd Abdul Mujib
1
Probablemente, la razón más probable es que ya ha sido respondida y parece que @MohdAbdulMujib está buscando un representante gratuito
Isaac
3
@ Isaac algunas personas pueden no estar muy interesadas en leer el manual completo cuando solo quieren comenzar a usar la función. De lo contrario, sería mejor leer el documento oficial. El objetivo de SO es la simplicidad en la que se proporcionan las respuestas. En mi humilde opinión
Mohd Abdul Mujib
3
// Using json as php array 

$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';

//or use from file
//$json = file_get_contents('results.json');

$someArray = json_decode($json, true);

foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
Sayeed amin
fuente
1

Podemos decodificar la cadena json en una matriz usando la función json_decode en php

1) json_decode ($ json_string) // devuelve el objeto

2) json_decode ($ json_string, true) // devuelve una matriz

$json_string = '{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$array = json_decode($json_string,true);

echo $array['type']; //it gives donut
Kankatala Krishna
fuente
0

Considere usar JSONPath https://packagist.org/packages/flow/jsonpath

Hay una explicación bastante clara de cómo usarlo y analizar un archivo JSON evitando todos los bucles propuestos. Si está familiarizado con el XPathde XMLusted comenzará a amar a este enfoque.

Paul Burilichev
fuente
-1

He escrito un paquete llamado JSON( GitHub , Packagist ). Si desea evitar gastos generales de usojson_* funciones, debe intentarlo.

Ejemplo

use MAChitgarha\Component\JSON;

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

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Vea el wiki o el tutorial rápido para familiarizarse con él.

Además, si desea leer archivos JSON y extraer sus datos (ya que parece que está intentando realizar esto), consulte el paquete JSONFile , que también lo he escrito.

MAChitgarha
fuente
-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

Verifique el código a continuación para convertir json en matriz PHP, si JSON es correcto, entonces json_decode()funciona bien y devolverá una matriz, pero si JSON está mal formado, entonces regresará NULL,

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

Si JSON tiene un formato incorrecto y solo espera una matriz, puede usar esta función,

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

Si JSON tiene un formato incorrecto y desea detener la ejecución del código, puede usar esta función,

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

Puede usar cualquier función según sus requisitos,

harish sharma
fuente