json_encode / json_decode - zwraca stdClass zamiast Array w PHP

108

Obserwuj ten mały skrypt:

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

Dlaczego PHP zamienia obiekt JSON w klasę?

Czy tablica, która json_encodedwtedy nie powinna json_decodeddawać DOKŁADNEGO tego samego wyniku?

Derek Adair
źródło

Odpowiedzi:

146

Przyjrzyj się bliżej drugiemu parametrowi json_decode($json, $assoc, $depth)pod adresem https://secure.php.net/json_decode

VolkerK
źródło
7
Nie odpowiada na pytanie - dlaczego domyślna jest klasa stdClass. Zobacz także stackoverflow.com/questions/3193765/…
William Entriken
7
To naprawdę nie odpowiada na pytanie, po prostu zapewnia obejście. Ale kiepskie obejście, IMO. A co, jeśli chcesz, aby obiekty zakodowane w formacie JSON były dekodowane jako obiekty, a tablice asocjacyjne z dekodowaniem w formacie JSON były dekodowane jako tablice asocjacyjne, automatycznie? Użycie drugiego parametru do json_decode () implikuje jakąś ludzką interwencję. Szczerze mówiąc, to jest kiepskie (z PHP, nie z tej odpowiedzi)
JDS
@JDS możesz bardzo łatwo opakować te funkcje i utworzyć własne, które w razie potrzeby przechują typ źródła w kluczu JSON w sposób przejrzysty.
sivann
2
@JDS Dodałem odpowiedź, która faktycznie odpowiada na pytanie „Dlaczego PHP zamienia obiekt JSON w klasę?”
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

daje tablicę.

Kai Chan
źródło
2
To jest tak żałośnie pomocne, dziękuję @Kai Chain - przypuszczam, że pierwotne pytanie brzmiało „Dlaczego”, ale wydaje się, że osiągnęło to, co zamierzali. Niezależnie od przypadku, idealne do mojej sytuacji.
ghukill
I wykonuje tę samą pracę po 4 latach tutaj! Podstawowa wiedza, że ​​każdy powinien najpierw się uczyć, tak jak ja!
KJS
21

Aby odpowiedzieć na rzeczywiste pytanie:

Dlaczego PHP zamienia obiekt JSON w klasę?

Przyjrzyj się bliżej wynikowi zakodowanego JSON, rozszerzyłem przykład, który OP daje trochę:

$array = array(
    'stuff' => 'things',
    'things' => array(
        'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
    )
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}

Format JSON wywodzi się z tego samego standardu co JavaScript ( standard języka programowania ECMAScript ) i jeśli spojrzeć na format, wygląda jak JavaScript. Jest to obiekt JSON ( {}= obiekt ) posiadający właściwość „stuff” o wartości „things” oraz właściwość „things”, której wartością jest tablica ciągów ( []= tablica ).

JSON (jako JavaScript) nie zna tablic asocjacyjnych tylko tablice indeksowane. Więc kiedy JSON koduje tablicę asocjacyjną PHP, da to ciąg JSON zawierający tę tablicę jako „obiekt”.

Teraz ponownie dekodujemy JSON przy użyciu json_decode($arrayEncoded). Funkcja dekodowania nie wie, skąd pochodzi ten ciąg JSON (tablica PHP), więc dekoduje do nieznanego obiektu, który znajduje się stdClassw PHP. Jak zobaczysz, tablica łańcuchów „things” BĘDZIE dekodowana do indeksowanej tablicy PHP.

Zobacz także:


Dzięki https://www.randomlists.com/things za „rzeczy”

7ochem
źródło
2
to jest prawidłowa odpowiedź ... odpowiada na pytanie, podczas gdy inne dają obejście niewyjaśnionego problemu. Dzięki, chodziłem w kółko zapominając, że JSON nie obsługuje tablic asocjacyjnych!
marcus
5

Chociaż, jak wspomniano, możesz dodać tutaj drugi parametr, aby wskazać, że chcesz zwrócić tablicę:

$array = json_decode($json, true);

Wiele osób może zamiast tego rzucić wyniki:

$array = (array)json_decode($json);

Przeczytanie mogłoby być bardziej zrozumiałe.

Andrzej
źródło
4
Są różne. Uważaj, jeśli zakodowałeś wielowymiarową tablicę lub obiekt. Pierwsza daje tablicę tablic, druga tablicę obiektów.
Hector
2

tl; dr: JavaScript nie obsługuje tablic asocjacyjnych, dlatego też JSON.

W końcu to JSON, a nie JSAAN. :)

Więc PHP musi przekonwertować twoją tablicę na obiekt, aby zakodować w JSON.

LaVache
źródło
1
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

Jeśli zdekodujesz json do tablicy, informacje zostaną utracone w tej sytuacji.

bijiDango
źródło
0

Istnieje również dobra biblioteka kodowania / dekodowania json w PHP 4 (która jest nawet kompatybilna wstecz z PHP 5), o której jest mowa w tym wpisie na blogu: Używanie json_encode () i json_decode () w PHP4 (czerwiec 2009) .

Konkretny kod autorstwa Michała Migurskiego i Matta Knappa:

cwd
źródło