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;
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];
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 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;
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 agli elementi della stessa 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'];
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 genera 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;
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;
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 .