recorrer print leer json_decode example ejemplo php json

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 contiene null
  • 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; }