Come estraggo i dati da JSON con PHP?
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
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:
- scalari: stringhe , int , float e bool
- null (un tipo speciale a sé stante)
- tipi composti: oggetti e array .
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 true
come 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é:
- Il JSON è costituito interamente da solo che,
null
. - Il JSON non è valido: controlla il risultato
json_last_error_msg
o inseriscilo in qualcosa come JSONLint . - 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:
- Elaborazione di file JSON di grandi dimensioni in PHP
- Come iterare correttamente attraverso un grande file json
Come risolverlo
Vedi: Riferimento: tutti i modi di base per ordinare array e dati in PHP .
È 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_decode
richiede che la stringa sia validajson
altrimenti restituiràNULL
.- In caso di mancata decodifica,
json_last_error()
può essere utilizzato per determinare l'esatta natura dell'errore. - Assicurati di trasmettere il
utf8
contenuto, altrimentijson_decode
potresti restituire un erroreNULL
.
// 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>";
}
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
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 XPath
per XML
te inizierai ad amare questo approccio.