JSON decode renvoie NULL après un appel webservice
il y a un comportement étrange avec json_encode
et json_decode
et je ne trouve pas de solution:
mon application php appelle un service web php. Le webservice renvoie json qui ressemble à ceci:
var_dump($foo):
string(62) "{"action":"set","user":"123123123123","status":"OK"}"
maintenant, j'aime décoder le json dans ma demande:
$data = json_decode($foo, true)
mais il renvoie NULL
:
var_dump($data):
NULL
j'utilise php5.
Le contenu-Type de la réponse de la webservice: "text/html; charset=utf-8"
(a également essayé d'utiliser "application/json; charset=utf-8"
)
Quelle pourrait être la raison?
20 réponses
EDIT:
J'ai juste fait une inspection rapide de la corde fournie par L'opération. Le petit "caractère" devant l'attelle bouclée 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 comme
ici.
essentiellement le système que vous obtenez les données de l'envoie encodé en UTF-8 avec un BOM précédant les données. Vous devez supprimer les trois premiers octets de la chaîne avant de le jeter dans json_decode()
(un 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 caractère est sûrement la raison pour laquelle json_decode
échoue. La chaîne dans sa forme donnée n'est pas correctement une structure formatée par JSON (voir RFC 4627 )
Eh bien, j'ai eu un problème similaire et les problèmes étaient les guillemets magiques de 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);
Imprimer la dernière erreur json lors du débogage.
"151900920"
Utilisez aussi le json.fonction stringify () pour vérifier votre syntaxe JSON.
aucune des solutions ci-dessus n'a fonctionné pour moi, mais html_entity_decode($json_string)
a fait l'affaire
Essayez cette
$foo = utf8_encode($foo);
$data = json_decode($foo, true);
assurez-vous que si vous avez envoyé les données par la poste / GET, le serveur n'a pas échapper aux guillemets
$my_array = json_decode(str_replace ('\"','"', $json_string), true);
"{"action":"set","user":"123123123123","status":"OK"}"
Cette petite apostrophe au début - c'est quoi? Premier symbole après l'apostrophe.
j'ai eu le même problème dans un site en direct. Sur mon site local, ça marchait très bien. Pour fixer le même je viens D'ajouter le code ci-dessous
json_decode(stripslashes($_GET['arr']));
je viens de mettre ceci
$result = mb_convert_encoding($result,'UTF-8','UTF-8');
$result = json_decode($result);
et ça marche
hier j'ai passé 2 heures à vérifier et corriger cette erreur finalement j'ai trouvé que dans JSON string que je voulais décoder étaient '\' slashes. Donc la chose logique à faire est d'utiliser la fonction stripslashes ou quelque chose de similaire à la PL différente.
bien sûr, la meilleure façon est d'imprimer ce var et de voir ce qu'il devient après json_decode, s'il est nul, vous pouvez également utiliser la fonction json_last_error () pour déterminer l'erreur qu'il retournera entier mais ici sont ceux qui sont int décrit:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8
dans mon cas j'ai eu la sortie de json_last_error () comme numéro 4 donc c'est JSON_ERROR_SYNTAX . Puis je suis allé jeter un coup d'oeil à la chaîne elle-même que je voulais convertir et il avait dans la dernière ligne:
'\'title\' error ...'
Après c'est vraiment juste une solution facile.
$json = json_decode(stripslashes($response));
if (json_last_error() == 0) { // you've got an object in $json}
j'ai eu un tel problème avec le stockage de JSON-string dans MySQL. Je ne sais pas vraiment pourquoi, mais en utilisant htmlspecialchars_decode berofe json_decode a résolu le problème.
aucune de ces solutions n'a fonctionné pour moi. Ce qui a finalement fonctionné, c'est la vérification de l'encodage de la chaîne de caractères en la sauvegardant dans un fichier local et en l'ouvrant avec Notepad++. J'ai découvert que C'était "UTF-16", donc j'ai pu le convertir de cette façon:
$str = mb_convert_encoding($str,'UTF-8','UTF-16');
peut-être utilisez-vous la chose comme $
${
: ces caractères devraient être cités.
j'avais ce problème, quand j'appelais une méthode soap pour obtenir mes données, et que je retournais une chaîne json, quand j'ai essayé de faire json_decode, je n'arrêtais pas de recevoir null.
depuis que j'utilisais nusoap pour faire l'appel soap j'ai essayé de simplement rendre la chaîne json et maintenant je pouvais faire un json_decode, depuis que j'ai vraiment fait le neaded pour obtenir mes données avec un appel SOAP, ce que j'ai fait était d'ajouter ob_start () avant d'inclure nusoap, id a fait mon appel genereate JSON string, et puis avant de retourner mon chaîne json je n'ai ob_end_clean(), et j'ai OBTENU MON PROBLÈME résolu :)
exemple
//HRT - SIGNED
//20130116
//verifica se um num assoc deco é valido
ob_start();
require('/nusoap.php');
$aResponse['SimpleIsMemberResult']['IsMember'] = FALSE;
if(!empty($iNumAssociadoTmp))
{
try
{
$client = new soapclientNusoap(PartnerService.svc?wsdl',
array(
// OPTS
'trace' => 0,
'exceptions' => false,
'cache_wsdl' => WSDL_CACHE_NONE
)
);
//MENSAGEM A ENVIAR
$sMensagem1 = '
<SimpleIsMember>
<request>
<CheckDigit>'.$iCheckDigitAssociado.'</CheckDigit>
<Country>Portugal</Country>
<MemberNumber">'.$iNumAssociadoDeco.'</MemberNumber>
</request>
</SimpleIsMember>';
$aResponse = $client->call('SimpleIsMember',$sMensagem1);
$aData = array('dados'=>$aResponse->xpto, 'success'=>$aResponse->example);
}
}
ob_end_clean();
return json_encode($aData);
Je ne sais pas pourquoi? Mais ce travail:
$out = curl_exec($curl);
$out = utf8_encode($out);
$out = str_replace("?", "", $out);
if (substr($out,1,1)!='{'){
$out = substr($out,3);
}
$arResult["questions"] = json_decode($out,true);
sans utf8_encode () - ne fonctionne pas
Vérifiez l'encodage de votre fichier. J'utilisais netbeans et j'ai dû utiliser l'encodage iso windows 1252 pour un vieux projet et netbeans utilisait cet encodage depuis lors pour chaque nouveau fichier. json_decode retournera alors NULL. Enregistrer à nouveau le fichier avec L'encodage UTF-8 a résolu le problème pour moi.
dans le bloc-notes++, sélectionnez Encoding (à partir du menu du haut), puis assurez-vous que" Encoder en UTF-8 " est sélectionné.
cela affichera tous les caractères qui ne devraient pas être dans votre json qui causeraient l'échec de json_decode
.
essayez d'utiliser json_encode sur la chaîne avant d'utiliser json_decode... si ça peut marcher pour toi, mais pour moi, si... J'utilise laravel 4 ajaxing sur une route param.
$username = "{username: john}";
public function getAjaxSearchName($username)
{
$username = json_encode($username);
die(var_dump(json_decode($username, true)));
}
Vous devriez essayer json_last_error_msg() . Il vous donnera le message d'erreur et vous dira ce qui ne va pas. Il a été introduit en PHP 5.5.
$foo = "{"action":"set","user":"123123123123","status":"OK"}";
$data = json_decode($foo, true);
if($data == null) {
throw new Exception('Decoding JSON failed with the following message: '
. json_last_error_msg());
}
// ... JSON decode was good => Let's use the data
j'ai eu un problème similaire, Je l'ai fait fonctionner après avoir ajouté " (guillemets simples) autour de la chaîne json_encode. Suivant mon fichier js:
var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING
var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING
juste pensé à l'affichage dans le cas où quelqu'un tombe sur ce post, comme moi: -)