ejemplo - Cómo resolver el error JSON_ERROR_UTF8 en php json_decode?
jsonp vs json (3)
Estoy intentando este código
$json = file_get_contents("http://www.google.com/alerts/preview?q=test&t=7&f=1&l=0&e");
print_r(json_decode(utf8_encode($json), true));
//////////////
// Define the errors.
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants["json"] as $name => $value) {
if (!strncmp($name, "JSON_ERROR_", 11)) {
$json_errors[$value] = $name;
}
}
// Show the errors for different depths.
foreach (range(4, 3, -1) as $depth) {
var_dump(json_decode($json, true, $depth));
echo ''Last error: '', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
}
He intentado muchas funciones, html_entities_decode, utf8_encode y decodificar, decodificar los códigos hexadecimales, pero siempre obtengo el error "JSON_ERROR_UTF8".
¿Cómo podría resolver esto?
La función iconv no tiene ningún valor a menos que pueda garantizar que la entrada sea válida. Use mb_convert_encoding en su lugar.
mb_convert_encoding($value, "UTF-8", "auto");
Puede obtener más explícita que "auto", e incluso especificar una lista de codificaciones de entrada esperadas separadas por comas.
Lo que es más importante, los caracteres inválidos serán manejados sin causar que toda la cadena sea descartada (a diferencia de iconv).
Necesitas una línea simple de código:
$input = iconv(''UTF-8'', ''UTF-8//IGNORE'', utf8_encode($input));
$json = json_decode($input);
Crédito: Sang Le, mi compañero de clase me dio este código. ¡Sí!
Hay una buena función para desinfectar sus matrices.
Te sugiero que uses un contenedor json_encode como este:
function safe_json_encode($value, $options = 0, $depth = 512){
$encoded = json_encode($value, $options, $depth);
switch (json_last_error()) {
case JSON_ERROR_NONE:
return $encoded;
case JSON_ERROR_DEPTH:
return ''Maximum stack depth exceeded''; // or trigger_error() or throw new Exception()
case JSON_ERROR_STATE_MISMATCH:
return ''Underflow or the modes mismatch''; // or trigger_error() or throw new Exception()
case JSON_ERROR_CTRL_CHAR:
return ''Unexpected control character found'';
case JSON_ERROR_SYNTAX:
return ''Syntax error, malformed JSON''; // or trigger_error() or throw new Exception()
case JSON_ERROR_UTF8:
$clean = utf8ize($value);
return safe_json_encode($clean, $options, $depth);
default:
return ''Unknown error''; // or trigger_error() or throw new Exception()
}
}
function utf8ize($mixed) {
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = utf8ize($value);
}
} else if (is_string ($mixed)) {
return utf8_encode($mixed);
}
return $mixed;
}
En mi aplicación utf8_encode () funciona mejor que iconv ()