json_decode na tablicę

422

Próbuję zdekodować ciąg JSON do tablicy, ale pojawia się następujący błąd.

Błąd krytyczny: nie można użyć obiektu typu stdClass jako tablicy w C: \ wamp \ www \ temp \ asklaila.php w linii 6

Oto kod:

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

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>
Harsha MV
źródło
1
To zadziałałoby, gdybyś $ob->Resultzamiast tego miał dostęp .
lapin

Odpowiedzi:

839

Zgodnie z dokumentacją musisz określić, czy chcesz obiekt tablicy asocjacyjnej zamiast obiektu json_decode, będzie to kod:

json_decode($jsondata, true);
Stephen
źródło
4
Nasuwa się pytanie, jakie są zalety zwracania go jako tablicy, a nie obiektu?
Foxinni,
52
Rodzi to pytanie. „Błagać pytanie” oznacza zakładać coś, co pozostaje do udowodnienia ( zob .). W obu przypadkach zaletą może być to, że OP jest wygodniejszym przejściem przez tablice niż obiekty, lub że jakiś inny, już zaimplementowany kod wymaga tablicy.
jamesnotjim
8
@jamesnotjim Domyślna implementacja zwracająca obiekt może wywołać pytanie, czy obiekty mają lepsze wartości zwracane niż tablice, prawda?
David Mann
7
Rzeczywiście może to @DavidMann. Touché!
jamesnotjim
8
Dodałbym komentarz (choć lata później), że nie ma możliwości, aby JSON zawierał tylko dane, co czyni z tego mylący wybór „domyślny”.
Barry
45

Spróbuj tego

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);
diEcho
źródło
27

Jest to wkład późno, ale jest ważna sprawa do odlewania json_decodez (array).
Rozważ następujące:

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

Jeśli $jsondatakiedykolwiek zostanie zwrócony jako pusty ciąg (jak z mojego doświadczenia wynika, że ​​często), json_decodezwróci NULL, powodując błąd Ostrzeżenie: Podano niepoprawny argument dla foreach () w wierszu 3 . Możesz dodać wiersz kodu if / then lub operatora trójskładnikowego, ale IMO jest czystsze, aby po prostu zmienić wiersz 2 na ...

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

... chyba że json_decodenarazisz miliony dużych tablic naraz, w takim przypadku, jak wskazuje @ TCB13, wydajność może zostać negatywnie wpłynięta.

neokio
źródło
6

Zgodnie z funkcją dokumentacji PHP json_decode ma parametr o nazwie assoc, który przekształca zwrócone obiekty w tablice asocjacyjne

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

Ponieważ parametr assoc jest FALSEdomyślnie, musisz ustawić tę wartość na TRUE, aby pobrać tablicę.

Przeanalizuj poniższy kod pod kątem przykładowej implikacji:

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

które wyjścia:

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)
}
Arosha De Silva
źródło
5

Spowoduje to również zmianę na tablicę:

<?php
    print_r((array) json_decode($object));
?>
coreyavis
źródło
6
Ta strata CPU / pamięci, jak sugeruje robi dokładnie to samo, wewnętrznie znacznie szybciej. json_decode($object, true);true
TCB13,
1
@ TCB13, chyba że potrzebujesz obu i nie chcesz ponownie uruchamiać dekodowania
Jimmy Kane
3
Zgadzam się z @JimmyKane. Próbowałem i uruchomiłem obie wersje w cyklu; jeśli potrzebujesz zarówno obiektu, jak i tablicy (choć zdarza się to rzadko?), json_decoderzutowanie + jest 45% szybsze niż uruchamianie obu smaków json_decode. Z drugiej strony oba są tak szybkie, że jeśli nie potrzebujesz dosłownie tysięcy dekodowań, różnica jest znikoma.
LSerni
4

json_decodeobsługa drugiego argumentu, gdy zostanie ustawiony TRUE, zwróci Arrayzamiast stdClass Object. Sprawdź stronę Manualjson_decode funkcji, aby zobaczyć wszystkie obsługiwane argumenty i szczegóły.

Na przykład spróbuj tego:

$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!
Arjun Kariyadan
źródło
3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

Więc jeśli chcesz tablicę, możesz przekazać drugi argument jako „true” w json_decodefunkcji.

Shanu Singh
źródło
3

mam nadzieję, że to Ci pomoże

$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"}  
        ]}';

Użyj funkcji dekodowania Json

$json_pss = json_decode($json_ps, true);

Pętle w tablicy JSON w php

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

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

}

Wynik : systemy komputerowe (sieci)

TechyFlick
źródło
2

w PHP json_decode konwertuj dane json na tablicę powiązaną z PHP
Na przykład:$php-array= json_decode($json-data, true); print_r($php-array);

Salman Mohammad
źródło
2

Spróbuj tego

<?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']);
?>
Dipali Sakle Systematix
źródło
2

Spróbuj tak:

$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
}
lalithkumar
źródło