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?

56
demandé sur SomeKittens 2009-03-27 13:11:48

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 )

61
répondu Stefan Gehrig 2017-05-23 12:34:24

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);
73
répondu Pablo 2015-10-06 02:53:19

Imprimer la dernière erreur json lors du débogage. "151900920" Utilisez aussi le json.fonction stringify () pour vérifier votre syntaxe JSON.

33
répondu LarryBattle 2015-09-21 12:57:10

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

24
répondu djb 2011-10-25 17:24:21

Essayez cette

$foo = utf8_encode($foo);
$data = json_decode($foo, true);
18
répondu Ólafur Waage 2009-03-27 10:15:49

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);
7
répondu ikary 2011-12-07 21:53:27
"{"action":"set","user":"123123123123","status":"OK"}"

Cette petite apostrophe au début - c'est quoi? Premier symbole après l'apostrophe.

5
répondu Kuroki Kaze 2009-03-27 10:31:59

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']));

4
répondu mona 2012-10-26 12:40:46

je viens de mettre ceci

$result = mb_convert_encoding($result,'UTF-8','UTF-8'); 
    $result = json_decode($result);

et ça marche

3
répondu Ivan Ivanovych Lukyanchuk 2013-06-08 07:55:16

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}
3
répondu Matija 2013-08-08 08:01:42

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.

1
répondu Victoria 2011-06-23 16:03:37

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');
1
répondu Roey B 2012-05-13 17:12:57

peut-être utilisez-vous la chose comme $ ${ : ces caractères devraient être cités.

1
répondu baquiax 2015-03-29 20:06:18

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);
0
répondu Henrique Torres 2013-01-16 17:23:17

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

0
répondu Orange_shadow 2013-03-06 07:52:56

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.

0
répondu Lukas 2013-08-05 08:53:32

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 .

0
répondu philipbrown 2013-09-05 08:04:43

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)));
}
0
répondu John Manning 2014-11-22 01:53:45

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
0
répondu HNygard 2015-02-05 12:50:57

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: -)

-4
répondu harry 2010-06-08 14:04:26