The json_decode
fails because the value it receives contains characters Unicode, probably GOOD (Byte Therder MArk).
One of the ways around this is to use the function utf8_encode
before calling json_decode
.
$linkAnapro = 'http://s.anapro.com.br/a-p/dados/b3gkhu%252f3ohE%253d/estoque.json';
$output = file_get_contents($linkAnapro);
$output = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($output));
$json = json_decode($output);
if (json_last_error() == 0) { // Sem erros
print_r($json);
} else {
echo "Erro inesperado ". json_last_error();
}
The function json_last_error()
in this case returns JSON_ERROR_UTF8
, if you prefer to treat this error or others that may occur, do the following:
function json_decode2($valor){
$json = json_decode($valor);
switch (json_last_error()) {
case JSON_ERROR_NONE:
return $json;
case JSON_ERROR_DEPTH:
return 'A profundidade máxima da pilha foi excedida';
case JSON_ERROR_STATE_MISMATCH:
return 'JSON inválido ou mal formado';
case JSON_ERROR_CTRL_CHAR:
return 'Erro de caractere de controle, possivelmente codificado incorretamente';
case JSON_ERROR_SYNTAX:
return 'Erro de sintaxe';
case JSON_ERROR_UTF8: // O seu caso!
$json = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($valor));
return json_encode($json);
default:
return 'Erro desconhecido';
}
}
To use:
$linkAnapro = 'http://s.anapro.com.br/a-p/dados/b3gkhu%252f3ohE%253d/estoque.json';
$output = file_get_contents($linkAnapro);
echo json_decode2($output);
Another way would be to remove the characters that are causing the problem:
$linkAnapro = 'http://s.anapro.com.br/a-p/dados/b3gkhu%252f3ohE%253d/estoque.json';
$output = file_get_contents($linkAnapro);
$json = json_decode(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $output)); // Remove os caracteres não imprimíveis da string
if (json_last_error() == 0) { // Sem erros
print_r($json);
} else {
echo "Erro inesperado ". json_last_error();
}
Thank you William, it worked!
– Alisson Acioli