json_encode / json_decode - retorna stdClass em vez de Array em PHP

108

Observe este pequeno script:

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

Por que o PHP transforma o objeto JSON em uma classe?

Uma matriz que é, json_encodedentão, não deveria json_decodedproduzir o mesmo resultado EXATO?

Derek Adair
fonte

Respostas:

145

Dê uma olhada no segundo parâmetro de json_decode($json, $assoc, $depth)em https://secure.php.net/json_decode

VolkerK
fonte
7
Não responde à pergunta - por que um stdClass é o padrão. Consulte também stackoverflow.com/questions/3193765/…
William Entriken
7
Isso realmente não responde à pergunta, apenas fornece uma solução alternativa. Mas uma péssima solução alternativa, IMO. E se você quiser que os objetos codificados por JSON sejam decodificados como objetos e matrizes associativas decodificadas por JSON sejam decodificadas como matrizes associativas, automaticamente? Usar o segundo parâmetro para json_decode () implica em algum tipo de intervenção humana. Francamente, isso é péssimo (do PHP, não desta resposta)
JDS
@JDS você pode facilmente agrupar essas funções e criar suas próprias, que armazenam o tipo de fonte em uma chave json de forma transparente, se necessário.
sivann
2
@JDS Eu adicionei uma resposta que realmente responde à pergunta "Por que o PHP transforma o objeto JSON em uma classe?"
7ochem
82
$arrayDecoded = json_decode($arrayEncoded, true);

fornece uma matriz.

Kai Chan
fonte
2
Isso é lamentavelmente útil, obrigado @Kai Chain - suponho que a pergunta original era "Por que", mas parece que isso vai chegar ao que pretendiam. Seja qual for o caso, perfeito para minha situação.
ghukill de
E faz o mesmo trabalho depois de 4 anos aqui! Conhecimento básico de que todos deveriam estudar primeiro, como eu!
KJS
20

Para responder à pergunta real:

Por que o PHP transforma o objeto JSON em uma classe?

Dê uma olhada na saída do JSON codificado, estendi um pouco o exemplo que o OP está fornecendo:

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

O formato JSON foi derivado do mesmo padrão do JavaScript ( ECMAScript Programming Language Standard ) e se você olhar para o formato, parece JavaScript. É um objeto JSON ( {}= objeto ) que tem uma propriedade "stuff" com o valor "things" e tem uma propriedade "things" com seu valor sendo um array de strings ( []= array ).

JSON (como JavaScript) não conhece arrays associativos, apenas arrays indexados. Portanto, ao codificar JSON um array associativo PHP, isso resultará em uma string JSON contendo esse array como um "objeto".

Agora estamos decodificando o JSON novamente usando json_decode($arrayEncoded). A função de decodificação não sabe de onde essa string JSON se originou (uma matriz PHP), então ela está decodificando em um objeto desconhecido, que está stdClassno PHP. Como você verá, o array "coisas" de strings IRÁ decodificar em um array PHP indexado.

Veja também:


Obrigado a https://www.randomlists.com/things pelas 'coisas'

7ochem
fonte
2
esta é a resposta correta ... responde à pergunta, enquanto os outros fornecem soluções alternativas para um problema inexplicável. Obrigado, eu estava andando em círculos esquecendo que JSON não oferece suporte a matrizes associativas!
marcus
5

Embora, conforme mencionado, você possa adicionar um segundo parâmetro aqui para indicar que deseja que uma matriz seja retornada:

$array = json_decode($json, true);

Muitas pessoas podem preferir lançar os resultados em vez disso:

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

Pode ser mais claro de ler.

Andrew
fonte
4
Existem diferentes. Esteja ciente se você codificou uma matriz ou objeto multidimensional. O primeiro fornece o array de arrays, o segundo fornece o array de objetos.
Hector
2

tl; dr: JavaScript não oferece suporte a matrizes associativas, portanto, nem JSON.

Afinal, é JSON, não JSAAN. :)

Portanto, o PHP precisa converter seu array em um objeto para codificar em JSON.

LaVache
fonte
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]

Se você decodificar o json em array, as informações serão perdidas nesta situação.

bijiDango
fonte