Come estraggo i dati da JSON con PHP?


226

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?


1
Correlati: in grado di vedere una variabile nell'output di print_r (), ma non sono sicuro di come accedervi nel codice , l'esplorazione JSON interattiva nel contesto di PHP è possibile qui: array.include-once.org
hakre

Per favore, posso sapere perché questa domanda non considera come una domanda duplicata anche 9 o meno utenti contrassegnati come duplicati per stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M
Sono la persona più stupida

@IamtheMostStupidPerson cercherò di spiegare, anche se il tuo nome utente mi fa dubitare che lo capirai;). Questa domanda viene posta e le sue risposte sono scritte in modo "canonico". In quanto tale, è un destinatario migliore per obiettivi duplicati rispetto alle altre domande.
Félix Gagnon-Grenier

Risposte:


453

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 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 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']; //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 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; //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 .


sono appena incappato in questa risposta e ho scoperto che il collegamento a array.include-once.org è interrotto.
Jeff

sì, considerando il nome del collegamento e come l'hai descritto, sembra un vero peccato.
Jeff

l'unica cosa che manca a questa soluzione era come estrarre i dati da un altro file json. Suggerirei, questo solutuon: stackoverflow.com/questions/19758954/...
Ishan Srivastava

19

È 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.

1
Probabilmente il motivo più probabile è che ha già ricevuto una risposta e sembra che @MohdAbdulMujib stia cercando un rappresentante gratuito
Isaac

3
@ Isaac alcune persone potrebbero non essere molto entusiaste di leggere l'intero manuale quando vogliono solo iniziare a usare la funzione. Altrimenti farebbero meglio a leggere il documento ufficiale. Il punto centrale di SO è la semplicità con cui vengono fornite le risposte. IMHO
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>";
}

1

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


-2

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

Controlla il codice sottostante per convertire json in array in PHP, se JSON è corretto, json_decode()funziona bene e restituirà un array, ma se JSON non è corretto NULL, tornerà ,

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

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

Se il formato JSON non è corretto e ti aspetti solo un array, puoi utilizzare questa funzione,

<?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) );

Se il formato JSON non è corretto e desideri interrompere l'esecuzione del codice, puoi utilizzare questa funzione,

<?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) );

Puoi usare qualsiasi funzione in base alle tue esigenze,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.