65 votes

json_decode renvoie NULL après un appel au webservice

Il y a un comportement étrange avec json_encode et json_decode et je n'arrive pas à trouver de solution :

Mon application php appelle un service web php. Le webservice renvoie un json qui ressemble à ceci :

var_dump($foo):
string(62) "{"action":"set","user":"123123123123","status":"OK"}"

maintenant j'aimerais décoder le json dans mon application :

$data = json_decode($foo, true)

mais il renvoie NULL :

var_dump($data):
NULL

J'utilise php5. Le Content-Type de la réponse du webservice : "text/html; charset=utf-8" (j'ai également essayé d'utiliser "application/json; charset=utf-8" )

Quelle pourrait être la raison ?

0 votes

J'ai eu le même problème, et cette réponse a fonctionné pour moi.

80voto

Pablo Points 1973

Eh bien, j'ai eu un problème similaire et le problème était les guillemets magiques PHP dans le serveur... voici ma solution :

if(get_magic_quotes_gpc()){
  $param = stripslashes($_POST['param']);
}else{
  $param = $_POST['param'];
}
$param = json_decode($param,true);

4 votes

Merci beaucoup Pablo pour ta réponse ! !! tu m'as fait gagner beaucoup de temps ! !!

3 votes

Merci mon pote, je ne pensais pas que les guillemets magiques causeraient un tel problème, j'étais presque au point de crier sur le moniteur. A la vôtre.

1 votes

@Pablo pourquoi tu appelles stripslashes() quand get_magic_quotes_gpc() retourne vrai ? ça a marché pour moi mais après avoir ajouté ( !) avant get_magic_quotes_gpc, de sorte que si get_magic_quotes_gpc ne retourne pas vrai j'appelle spripslashes()

74voto

Stefan Gehrig Points 47227

EDIT : Je viens de faire une inspection rapide de la chaîne fournie par l'OP. Le petit "caractère" devant l'accolade est un UTF-8 B(yte) O(rder) M(ark) 0xEF 0xBB 0xBF . Je ne sais pas pourquoi cette séquence d'octets est affichée en tant que ici.

En fait, le système à partir duquel vous obtenez les données les envoie codées en UTF-8 avec une nomenclature précédant les données. Vous devez supprimer les trois premiers octets de la chaîne de caractères avant de la lancer dans le fichier json_decode() (a substr($string, 3) fera l'affaire).

string(62) "{"action":"set","user":"123123123123","status":"OK"}"
            ^
            |
            This is the UTF-8 BOM

Comme Kuroki Kaze découvert, ce personnage est certainement la raison pour laquelle json_decode échoue. La chaîne de caractères dans sa forme donnée n'est pas correctement une structure formatée JSON (voir RFC 4627 )

1 votes

Je ne pense pas. C'est un crochet. Je pense que chaque structure JSON devrait commencer par un crochet.

8 votes

Non, pas l'accolade - il y a un caractère juste avant l'accolade.

6 votes

Je pense que le formatage de SO essaie de rendre la question difficile à répondre. :-p

35voto

LarryBattle Points 201

Affiche la dernière erreur json lors du débogage.

json_decode( $so, true, 9 );
$json_errors = array(
    JSON_ERROR_NONE => 'No error has occurred',
    JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
    JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
    JSON_ERROR_SYNTAX => 'Syntax error',
);
 echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;

Utilisez également la fonction json.stringify() pour vérifier la syntaxe de votre JSON.

0 votes

Un de nos utilisateurs vient de rencontrer ce problème : PHP.net est mauvais et cela a été introduit avec 5.3 donc je peux confirmer @MdOliya

0 votes

Cela m'a beaucoup aidé !

30voto

djb Points 1131

Aucune des solutions ci-dessus n'a fonctionné pour moi, mais html_entity_decode($json_string) a fait l'affaire

0 votes

Cela a fonctionné sur une chaîne json stockée dans une table mysql utf8. Je soupçonne qu'il se passe quelque chose lors du stockage dans mysql.

2 votes

Merci ! J'ai passé des heures à essayer différentes solutions et c'est la seule chose qui a fonctionné.

1 votes

C'est ce qui a marché pour moi aussi. C'est nécessaire pour décoder le JSON stocké dans Wordpress.

21voto

Ólafur Waage Points 40104

Essayez ceci

$foo = utf8_encode($foo);
$data = json_decode($foo, true);

0 votes

Salut Olafur, utf8_encode écrit des caractères étranges au début de la chaîne. utf8_decode écrit un ? au début de la chaîne. C'est juste une solution de contournement, mais cela fonctionne. Je suis sûr qu'il y a une meilleure façon : $foo = utf8_decode($result->data) ; json_decode(str_replace(" ?", "", $foo), true) ;

2 votes

Cela a marché pour moi aussi, toutes les autres réponses mentionnées n'ont pas marché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X