Come estraggo i dati da JSON con PHP?

Mar 28 2015

Questa vuole essere una domanda di riferimento generale e una risposta che copre molte delle infinite "Come accedo ai dati nel mio JSON?" domande. È qui per gestire le basi generali della decodifica di JSON in PHP e l'accesso ai risultati.

Ho il JSON:

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

Come posso decodificarlo in PHP e accedere ai dati risultanti?

Risposte

460 user3942918 Mar 28 2015 at 02:38

Intro

Prima di tutto hai una stringa. JSON non è un array, un oggetto o una struttura dati. JSON è un formato di serializzazione basato su testo, quindi una stringa di fantasia, ma comunque solo una stringa. Decodificalo in PHP usando json_decode().

 $data = json_decode($json);

Qui potresti trovare:

Queste sono le cose che possono essere codificate in JSON. O più precisamente, queste sono le versioni PHP delle cose che possono essere codificate in JSON.

Non c'è niente di speciale in loro. Non sono "oggetti JSON" o "array JSON". Hai decodificato il JSON: ora hai i tipi PHP di base per tutti i giorni .

Gli oggetti saranno istanze di stdClass , una classe incorporata che è solo una cosa generica che non è importante qui.


Accesso alle proprietà degli oggetti

Si accede alle proprietà di uno di questi oggetti nello stesso modo in cui si accede alle proprietà pubbliche non statiche di qualsiasi altro oggetto, ad es $object->property.

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

$yummy = json_decode($json);

echo $yummy->type; //donut

Accesso agli elementi dell'array

Si accede agli elementi di uno di questi array nello stesso modo in cui si accede a qualsiasi altro array, ad es $array[0].

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

$toppings = json_decode($json);

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

Ripeti con foreach.

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


Cioccolato Glassato con Spruzza
Acero

O scherzare con una qualsiasi delle funzioni array incorporate da miliardi .


Accesso agli elementi nidificati

Le proprietà degli oggetti e gli elementi degli array potrebbero essere più oggetti e / o array: puoi semplicemente continuare ad accedere alle loro proprietà e ai loro membri come al solito, ad es $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

Passaggio truecome secondo argomento a json_decode ()

Quando lo fai, invece degli oggetti otterrai array associativi - array con stringhe per chiavi. Anche in questo caso si accede ai suoi elementi come al solito, ad es $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

Accesso agli elementi dell'array associativo

Quando si decodifica un oggetto JSON in un array PHP associativo, è possibile iterare sia chiavi che valori utilizzando la foreach (array_expression as $key => $value)sintassi, ad es.

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

Stampe

Il valore della chiave "foo" è "foo value"
Il valore della chiave "bar" è "bar value"
Il valore della chiave "baz" è "baz value"


Non so come sono strutturati i dati

Leggi la documentazione per qualunque cosa da cui stai ottenendo il JSON.

Guarda il JSON - dove vedi parentesi graffe {}aspettarsi un oggetto, dove vedi parentesi quadre []aspettarsi un array.

Colpisci i dati decodificati con 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);

e controlla l'output:

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
                )

        )

)

Ti dirà dove hai gli oggetti, dove hai gli array, insieme ai nomi e ai valori dei loro membri.

Se si può ottenere solo finora in esso prima si perde - andare così lontano e ha colpito che con print_r():

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

Dai un'occhiata in questo pratico esploratore JSON interattivo .

Rompi il problema in pezzi che sono più facili da capire.


json_decode() ritorna null

Ciò accade perché:

  1. Il JSON è costituito interamente da solo che, null.
  2. Il JSON non è valido: controlla il risultato json_last_error_msgo inseriscilo in qualcosa come JSONLint .
  3. Contiene elementi annidati a più di 512 livelli di profondità. Questa profondità massima predefinita può essere sovrascritta passando un intero come terzo argomento a json_decode().

Se devi modificare la profondità massima, probabilmente stai risolvendo il problema sbagliato. Scopri perché stai ottenendo dati così profondamente nidificati (ad esempio, il servizio che stai interrogando che sta generando il JSON ha un bug) e fai in modo che non accada.


Il nome della proprietà dell'oggetto contiene un carattere speciale

A volte avrai un nome di proprietà dell'oggetto che contiene qualcosa come un trattino -o un segno @che non può essere utilizzato in un identificatore letterale. Invece puoi usare una stringa letterale all'interno di parentesi graffe per risolverlo.

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

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

Se si dispone di un numero intero come proprietà, vedere: Come accedere alle proprietà degli oggetti con nomi come numeri interi? come riferimento.


Qualcuno ha inserito JSON nel tuo JSON

È ridicolo ma succede: c'è JSON codificato come una stringa all'interno del tuo JSON. Decode, l'accesso alla stringa come al solito, decodifica che , e alla fine arriva a quello che vi serve.

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

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

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

I dati non si adattano alla memoria

Se il tuo JSON è troppo grande per json_decode()essere gestito immediatamente, le cose iniziano a diventare complicate. Vedere:


Come risolverlo

Vedi: Riferimento: tutti i modi di base per ordinare array e dati in PHP .

19 MohdAbdulMujib Oct 26 2016 at 20:24

È possibile utilizzare json_decode () per convertire una stringa json in un oggetto / array PHP.

Per esempio.

Ingresso:

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

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

Produzione:

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

Pochi punti da ricordare:

  • json_decoderichiede che la stringa sia valida jsonaltrimenti restituirà NULL.
  • In caso di mancata decodifica, json_last_error()può essere utilizzato per determinare l'esatta natura dell'errore.
  • Assicurati di trasmettere il utf8contenuto, altrimenti json_decodepotresti restituire un errore NULL.
2 Sayeedamin Nov 06 2019 at 19:31
// 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>";
}
1 KankatalaKrishna Aug 06 2019 at 13:08

Possiamo decodificare la stringa json in un array usando la funzione json_decode in php

1) json_decode ($ json_string) // restituisce object

2) json_decode ($ json_string, true) // restituisce array

$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
PaulBurilichev Jan 22 2020 at 21:48

Prendi in considerazione l'utilizzo di JSONPath https://packagist.org/packages/flow/jsonpath

C'è una spiegazione abbastanza chiara di come usarlo e analizzare un file JSON evitando tutti i loop proposti. Se conosci XPathper XMLte inizierai ad amare questo approccio.