Ir para o conteúdo
jsonbeautifiers
Português
PHP Nomes de constantes e mensagens tirados do manual do PHP.

json_decode() returns NULL

O PHP não lança exceção em JSON inválido por padrão. O json_decode simplesmente devolve NULL, que também é um resultado legítimo para a entrada "null", então você não consegue distinguir falha de sucesso só pelo valor de retorno. A primeira tarefa é fazer o PHP te contar o que deu errado.

Cole o seu JSON e veja exatamente onde ele quebra

Entrada

Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo

O que realmente causa isso

Ordenados por quantas vezes cada um acaba sendo a resposta.

  1. 01 Você ainda não tem mensagem de erro nenhuma

    Chame json_last_error_msg() logo depois de decodificar, ou passe a flag JSON_THROW_ON_ERROR para que uma JsonException seja lançada. Sem uma das duas você depura às cegas, e é por isso que esse problema toma tanto tempo das pessoas.

    Quebra

    $data = json_decode($body, true);
    if ($data === null) { /* why? */ }

    Funciona

    $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
    // or
    $data = json_decode($body, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new RuntimeException(json_last_error_msg());
    }
  2. 02 Uma marca de ordem de bytes UTF-8 no começo do arquivo

    Um clássico do PHP, porque file_get_contents devolve o BOM e o json_decode rejeita. Remova os três primeiros bytes se forem EF BB BF.

  3. 03 UTF-8 malformado, dando JSON_ERROR_UTF8

    "Malformed UTF-8 characters, possibly incorrectly encoded" normalmente significa que os dados vieram de uma coluna de banco em Latin-1. Converta com mb_convert_encoding antes de decodificar.

  4. 04 Um warning ou notice impresso antes do JSON

    Qualquer saída anterior ao corpo da sua resposta acaba dentro dele. Desligue display_errors em produção e registre em log.

  5. 05 Aninhamento mais profundo que o limite padrão, dando JSON_ERROR_DEPTH

    O json_decode usa profundidade 512 por padrão. Aumente o terceiro argumento se os dados forem mesmo tão profundos.

Perguntas frequentes

Quais são as constantes JSON_ERROR?
JSON_ERROR_NONE (0), JSON_ERROR_DEPTH (1, profundidade máxima da pilha excedida), JSON_ERROR_STATE_MISMATCH (2), JSON_ERROR_CTRL_CHAR (3, caractere de controle inesperado encontrado), JSON_ERROR_SYNTAX (4, erro de sintaxe, JSON malformado), JSON_ERROR_UTF8 (5, caracteres UTF-8 malformados), além de JSON_ERROR_RECURSION, JSON_ERROR_INF_OR_NAN, JSON_ERROR_UNSUPPORTED_TYPE, JSON_ERROR_INVALID_PROPERTY_NAME, JSON_ERROR_UTF16 e JSON_ERROR_NON_BACKED_ENUM.
Como distingo um resultado NULL de uma falha NULL?
json_last_error() === JSON_ERROR_NONE significa que a decodificação deu certo, então um NULL devolvido é o valor null de verdade. Qualquer outro código significa que falhou.

Conserte agora

Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.

Encontrar o erro de sintaxe