print - recorrer json php
Detecta datos json malos en PHP json_decode()? (5)
/ ** * * custom json_decode * handle json_decode errors * * @param type $ json_text * @return type * / public static function custom_json_decode ($ json_text) {
$decoded_array = json_decode($json_text, TRUE);
switch (json_last_error()) {
case JSON_ERROR_NONE:
return array(
"status" => 0,
"value" => $decoded_array
);
case JSON_ERROR_DEPTH:
return array(
"status" => 1,
"value" => ''Maximum stack depth exceeded''
);
case JSON_ERROR_STATE_MISMATCH:
return array(
"status" => 1,
"value" => ''Underflow or the modes mismatch''
);
case JSON_ERROR_CTRL_CHAR:
return array(
"status" => 1,
"value" => ''Unexpected control character found''
);
case JSON_ERROR_SYNTAX:
return array(
"status" => 1,
"value" => ''Syntax error, malformed JSON''
);
case JSON_ERROR_UTF8:
return array(
"status" => 1,
"value" => ''Malformed UTF-8 characters, possibly incorrectly encoded''
);
default:
return array(
"status" => 1,
"value" => ''Unknown error''
);
}
}
Estoy tratando de manejar los datos mal JSON cuando se analiza a través de json_decode (). Estoy usando el siguiente script:
if(!json_decode($_POST)) {
echo "bad json data!";
exit;
}
Si $ _POST es igual a:
''{ bar: "baz" }''
Entonces json_decode maneja el error fino y escupe "bad json data!"; Sin embargo, si configuro $ _POST a algo así como "datos inválidos", me da:
Warning: json_decode() expects parameter 1 to be string, array given in C:/server/www/myserver.dev/public_html/rivrUI/public_home/index.php on line 6
bad json data!
¿Debo escribir un script personalizado para detectar datos JSON válidos, o hay alguna otra manera ingeniosa de detectar esto?
Aquí hay un par de cosas sobre json_decode
:
- devuelve los datos, o
null
cuando hay un error - también puede devolver
null
cuando no hay ningún error: cuando la cadena JSON contienenull
- se lanza una advertencia donde hay una advertencia - advertencia de que quieres hacer desaparecer.
Para resolver el problema de advertencia, una solución sería usar el operador @
(no suelo recomendar su uso, ya que hace que la depuración sea mucho más difícil ... Pero aquí, no hay mucho para elegir) :
$_POST = array(
''bad data''
);
$data = @json_decode($_POST);
json_decode
probar si $data
es null
y, para evitar el caso en el que json_decode
devuelve null
para null
en la cadena JSON, puede verificar json_last_error
, que (citando) :
Devuelve el último error (si lo hubo) producido por el último análisis de JSON.
Lo que significa que tendrías que usar algún código como el siguiente:
if ($data === null
&& json_last_error() !== JSON_ERROR_NONE) {
echo "incorrect data";
}
Así es como Guzzle maneja json
/**
* Parse the JSON response body and return an array
*
* @return array|string|int|bool|float
* @throws RuntimeException if the response body is not in JSON format
*/
public function json()
{
$data = json_decode((string) $this->body, true);
if (JSON_ERROR_NONE !== json_last_error()) {
throw new RuntimeException(''Unable to parse response body into JSON: '' . json_last_error());
}
return $data === null ? array() : $data;
}
Simplemente me rompí la cabeza por un error de sintaxis json en lo que parecía ser json perfecto: {"test1": "auto", "test2": "auto"} desde una cadena codificada en url.
Pero en mi caso, algunos de los anteriores fueron codificados en html, ya que la adición de html_entity_decode($string)
hizo el truco.
$ft = json_decode(html_entity_decode(urldecode(filter_input(INPUT_GET, ''ft'', FILTER_SANITIZE_STRING))));
Con suerte, esto le ahorrará a alguien más algo de tiempo.
También puede usar json_last_error: http://php.net/manual/en/function.json-last-error.php
que según la documentación dice:
Devuelve el último error (si lo hubo) 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;
}