Solución:
Aquí hay un par de cosas sobre json_decode
:
- devuelve los datos, o
null
cuando hay un error - también puede volver
null
cuando no hay error: cuando la cadena JSON contienenull
- genera una advertencia donde hay una advertencia, una advertencia que desea hacer desaparecer.
Para resolver el problema de advertencia, una solución sería utilizar el @
operador (No recomiendo usarlo a menudo, ya que hace que la depuración sea mucho más difícil … Pero aquí, no hay muchas opciones) :
$_POST = array(
'bad data'
);
$data = @json_decode($_POST);
Entonces tendrías que probar si $data
es null
– y, para evitar el caso en el que json_decode
devoluciones null
por null
en la cadena JSON, puede verificar json_last_error
, cuales (citando) :
Devuelve el último error (si lo hay) ocurrido por el último análisis JSON.
Lo que significa que tendrías que usar un código como el siguiente:
if ($data === null
&& json_last_error() !== JSON_ERROR_NONE) {
echo "incorrect data";
}
También puede usar json_last_error: http://php.net/manual/en/function.json-last-error.php
que como dice la documentación:
Devuelve el último error (si lo hubiera) ocurrido durante la última codificación / decodificación JSON.
Aquí hay un ejemplo
json_decode($string);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
Desde PHP 7.3, la función json_decode aceptará una nueva opción JSON_THROW_ON_ERROR que permitirá que json_decode arroje una excepción en lugar de devolver un valor nulo en caso de error.
Ejemplo:
try {
json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (JsonException $exception) {
echo $exception->getMessage(); // displays "Syntax error"
}