json_decode nell'array


422

Sto cercando di decodificare una stringa JSON in un array ma ottengo il seguente errore.

Errore irreversibile: impossibile utilizzare l'oggetto di tipo stdClass come array in C: \ wamp \ www \ temp \ asklaila.php sulla riga 6

Ecco il codice:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>

1
Avrebbe funzionato se avessi effettuato l'accesso $ob->Resultinvece.
lapin,

Risposte:


839

Secondo la documentazione , è necessario specificare se si desidera un array associativo anziché un oggetto json_decode, questo sarebbe il codice:

json_decode($jsondata, true);

4
Sorge la domanda: quali sono i vantaggi di restituirlo come un array e non come un oggetto?
Foxinni,

52
Solleva la domanda. "Fare una domanda" significa assumere qualcosa che resta da dimostrare ( rif ). In entrambi i casi, il vantaggio potrebbe essere che l'OP è più a suo agio nell'attraversare le matrici rispetto agli oggetti o che qualche altro codice già implementato richiede una matrice.
jamesnotjim,

8
@jamesnotjim L'implementazione predefinita che restituisce un oggetto potrebbe far sorgere la domanda che gli oggetti sono valori di ritorno migliori degli array, no?
David Mann,

7
In effetti potrebbe @DavidMann. Touché!
jamesnotjim,

8
Vorrei aggiungere il commento (anche se anni dopo) che non esiste alcuna possibilità che JSON contenga altro che dati che la rendono una scelta "predefinita" confusa.
Barry,

45

prova questo

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

27

Si tratta di un contributo in ritardo, ma c'è un caso valida per la fusione json_decodecon (array).
Considera quanto segue:

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

Se $jsondataviene mai restituito come stringa vuota (come spesso accade nella mia esperienza), json_decodeverrà restituito NULL, causando l'errore Avviso: argomento non valido fornito per foreach () sulla riga 3 . È possibile aggiungere una riga di if / then code o un operatore ternario, ma IMO è più semplice cambiare semplicemente la riga 2 in ...

$arr = (array) json_decode($jsondata,true);

... a meno che non si stiano json_decodeeseguendo milioni di array di grandi dimensioni contemporaneamente, nel qual caso come sottolinea @ TCB13, le prestazioni potrebbero essere influenzate negativamente.



6

Secondo la funzione di documentazione PHP json_decode ha un parametro chiamato assoc che converte gli oggetti restituiti in array associativi

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

Poiché il parametro assoc è FALSEpredefinito, è necessario impostare questo valore su TRUEper recuperare un array.

Esamina il codice seguente per un'implicazione di esempio:

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

che produce:

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

5

Questo lo cambierà anche in un array:

<?php
    print_r((array) json_decode($object));
?>

6
Questo uno spreco di CPU / memoria, come suggerisce json_decode($object, true);la truefa esattamente la stessa, internamente molto più veloce.
TCB13

1
@ TCB13 tranne se hai bisogno di entrambi e non vuoi eseguire di nuovo la decodifica
Jimmy Kane

3
Concordo con @JimmyKane. Ho provato ed eseguire entrambe le versioni in un ciclo; se hai bisogno sia di oggetti che di array (anche se questo dovrebbe accadere raramente?), json_decode+ casting è il 45% più veloce rispetto all'esecuzione di entrambi i gusti json_decode. D'altra parte, entrambi sono così veloci che a meno che non siano necessarie letteralmente migliaia di decodifiche, la differenza è trascurabile.
LSerni,

4

json_decodesupporta il secondo argomento, quando impostato su TRUErestituirà un Arrayinvece di stdClass Object. Controlla la pagina Manuale della json_decodefunzione per vedere tutti gli argomenti supportati e i suoi dettagli.

Ad esempio, prova questo:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Quindi, se si desidera un array, è possibile passare il secondo argomento come "vero" nella json_decodefunzione.


3

Spero che questo ti possa aiutare

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Utilizzare la funzione di decodifica Json

$json_pss = json_decode($json_ps, true);

Passare in loop su array JSON in php

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

Risultato : sistemi informatici (reti)


2

in PHP json_decode converti i dati json in array associato a PHP
Per esempio:$php-array= json_decode($json-data, true); print_r($php-array);


2

Per favore, prova questo

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

Prova in questo modo:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
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.