Menu

PHP json_decode(): converter JSON em array ou objeto

json_decode($json, true) transforma uma string JSON num array associativo PHP; sem true você recebe objetos stdClass. Veja valores aninhados, tratamento de erros com JSON_THROW_ON_ERROR, json_validate() e por que o json_decode retorna null.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

json_decode($json, true) transforma uma string JSON em valores PHP, com cada objeto JSON como array associativo. Deixe de fora o true e os objetos JSON viram objetos stdClass, lidos com ->. JSON inválido dá null.

Saída:

Ada
js
Ada
php
Array
(
    [name] => Ada
    [age] => 36
    [langs] => Array
        (
            [0] => php
            [1] => js
        )

    [admin] => 1
)

Arrays JSON sempre viram listas PHP, qualquer que seja o modo escolhido. O caminho inverso, de PHP para JSON, é o json_encode().

Array associativo ou objeto: true ou false

Os dois modos guardam os mesmos dados; escolha o que fica mais legível no seu código. Arrays funcionam com todas as funções de array (array_column, array_map, isset($data['key'])), então a maior parte do código passa true. Objetos precisam da sintaxe com chaves para chaves que não são nomes de propriedade válidos, como chaves com hífen ou números:

Saída:

Ada zero London
Ada zero London
object(stdClass)#2 (1) {
  ["city"]=>
  string(6) "London"
}

O quarto parâmetro recebe flags. JSON_OBJECT_AS_ARRAY também dá arrays, mas só enquanto o segundo argumento for null (o padrão dele): json_decode($json, flags: JSON_OBJECT_AS_ARRAY) retorna arrays, enquanto json_decode($json, false, 512, JSON_OBJECT_AS_ARRAY) continua retornando objetos.

Percorrer JSON aninhado

Respostas de APIs normalmente são uma lista de objetos dentro de um objeto. Decodifique uma vez, percorra com foreach e use ?? para campos que podem faltar:

Saída:

#1 Ada <ada@example.com> roles: admin, editor
#2 Linus <no email> roles: none
#3 Grace <grace@example.com> roles: editor
Array
(
    [1] => Ada
    [2] => Linus
    [3] => Grace
)

Tratar JSON inválido

O json_decode() retorna null para JSON inválido, mas null também é o resultado correto para o texto JSON null, então null sozinho não diz se falhou. json_last_error_msg() dá o motivo da última chamada. O jeito mais limpo é JSON_THROW_ON_ERROR, que lança uma JsonException:

Saída:

NULL
Syntax error
NULL
No error
Invalid JSON: Syntax error

O terceiro argumento, 512, é a profundidade máxima de aninhamento (o padrão). Com argumentos nomeados você pode pulá-lo: json_decode($json, true, flags: JSON_THROW_ON_ERROR).

Verificar se uma string é JSON válido com json_validate()

O PHP 8.3 adicionou o json_validate(). Ele responde true ou false sem montar os arrays decodificados, então usa menos memória que decodificar quando você só precisa de um sim ou não, por exemplo para rejeitar cedo o corpo de uma requisição:

Saída:

'{"a": 1}'    valid
'[1, 2, 3]'   valid
'"text"'      valid
'{a: 1}'      invalid: Syntax error
'{\'a\': 1}'  invalid: Syntax error
''            invalid: Syntax error

Se você vai usar os dados de qualquer jeito, pule o json_validate() e decodifique com JSON_THROW_ON_ERROR: validar antes faz o parse da string duas vezes.

Ler um arquivo JSON

Leia o arquivo com file_get_contents() e decodifique a string. Este bloco escreve settings.json antes para que haja um arquivo para ler:

Saída:

Theme: dark
Plugins: 2
{
    "theme": "dark",
    "fontSize": 16,
    "plugins": [
        "git",
        "lint"
    ]
}

Por que o json_decode retorna null: as causas comuns

O JSON é mais rígido que a sintaxe de arrays do JavaScript e do PHP. Cada string abaixo parece razoável e todas retornam null. Rode para ver o motivo de cada uma, depois corrija uma e rode de novo:

Saída:

single quotes    Syntax error
unquoted key     Syntax error
trailing comma   Syntax error
comment          Syntax error
byte order mark  Syntax error
too deep         Maximum stack depth exceeded
float(1.2345678901234567E+19)
string(20) "12345678901234567890"

Um byte order mark é invisível na maioria dos editores e é o motivo clássico de um arquivo JSON "parecer certo" mas não decodificar. Remova-o com $text = preg_replace('/^\xEF\xBB\xBF/', '', $text); antes de decodificar.

Perguntas frequentes

Como converto JSON em array no PHP?

Passe true como segundo argumento: json_decode('{"name":"Ada"}', true) retorna ['name' => 'Ada'], então você lê os valores com $data['name']. Sem true, objetos JSON viram objetos stdClass e você escreve $data->name.

Por que o json_decode retorna null?

O JSON é inválido (aspas simples, vírgula sobrando no fim, chaves sem aspas, um byte order mark), está aninhado além do limite de profundidade, ou o JSON é de fato null. Verifique json_last_error_msg(), ou decodifique com JSON_THROW_ON_ERROR para receber uma JsonException com o motivo.

Como verifico se uma string é JSON válido no PHP?

Desde o PHP 8.3, json_validate($string) retorna true ou false sem montar o valor decodificado. Em versões anteriores, decodifique e verifique json_last_error() === JSON_ERROR_NONE.

Como leio um arquivo JSON no PHP?

Leia o arquivo e depois decodifique: $data = json_decode(file_get_contents('data.json'), true, flags: JSON_THROW_ON_ERROR);. O file_get_contents() retorna false se o arquivo não existir, então verifique isso antes.

Como acesso uma chave JSON com hífen no PHP?

Decodifique para array e use $data['first-name'], ou com objetos use chaves: $obj->{'first-name'}. A mesma sintaxe com chaves funciona para chaves que são números, como $obj->{'0'}.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR