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
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.
-
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()); } -
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.
-
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.
-
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.
-
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