Dica de PHP · publicada em
O comportamento padrão do json_decode é devolver null quando o JSON é inválido. O problema é que um JSON válido contendo null devolve exatamente a mesma coisa, e você fica sem saber o que aconteceu.
Com JSON_THROW_ON_ERROR, um JSON malformado vira JsonException, que você captura e loga com a mensagem real. Isso importa muito ao consumir API externa, onde a resposta pode vir truncada ou ser uma página de erro em HTML.
Na codificação vale o mesmo, mais JSON_UNESCAPED_UNICODE e JSON_UNESCAPED_SLASHES: sem eles, acento vira sequência escapada e barra de URL vira \/, o que polui log e resposta de API.
try {
$dados = json_decode($corpo, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
error_log('Resposta invalida da API: ' . $e->getMessage());
return new WP_Error('json_invalido', 'Resposta inesperada do servico.');
}
$saida = json_encode($dados, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
Na prática: sempre JSON_THROW_ON_ERROR. E UNESCAPED_UNICODE|UNESCAPED_SLASHES ao codificar.