json_decode在webservice调用之后返回NULL

json_encodejson_decode有一个奇怪的行为,我找不到解决scheme:

我的PHP应用程序调用一个PHP的Web服务。 webservice返回如下所示的json:

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

现在我喜欢在我的应用程序中解码json:

 $data = json_decode($foo, true) 

但是它返回NULL

 var_dump($data): NULL 

我使用php5。 来自webservice的响应的内容types: "text/html; charset=utf-8" (也尝试使用"application/json; charset=utf-8"

可能是什么原因?

编辑:只是做了一些OP提供的string的快速检查。 在大括号前面的小“字符”是一个UTF-8 B(yte)O(rder)M(方舟) 0xEF 0xBB 0xBF 。 我不知道为什么这个字节序列显示在这里。

从本质上来说,您获取数据的系统会使用UTF-8编码,并在数据之前使用BOM。 在将其引入到json_decode()substr($string, 3)将会执行)之前,应该从string中移除前三个字节。

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

正如Kuroki Kaze所发现的,这个字符肯定是json_decode失败的原因。 其给定forms的string不正确的JSON格式结构(见RFC 4627 )

那么,我有一个类似的问题,问题是在服务器中的PHP魔术报价…这是我的解决scheme:

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

在debugging时打印最后的json错误。

 json_decode($ so,true,9);
 $ json_errors = array(
     JSON_ERROR_NONE =>'没有错误发生',
     JSON_ERROR_DEPTH =>'最大堆栈深度已被超过',
     JSON_ERROR_CTRL_CHAR =>'控制字符错误,可能错误编码',
     JSON_ERROR_SYNTAX =>'语法错误',
 );
  echo'Last error:',$ json_errors [json_last_error()],PHP_EOL,PHP_EOL;

另外使用json.stringify()函数来检查你的JSON语法。

上面的解决scheme都没有为我工作,但html_entity_decode($json_string)做了窍门

尝试这个

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

请确保如果您通过POST / GET发送数据,服务器不会退出引号

 $my_array = json_decode(str_replace ('\"','"', $json_string), true); 
 "{"action":"set","user":"123123123123","status":"OK"}" 

这个小小的撇号开头 – 这是什么? 双引号之后的第一个符号。

我在现场有类似的问题。 在我的本地网站,它工作正常。 为了解决这个问题,我只是添加了下面的代码

json_decode(stripslashes($_GET['arr']));

我只是把这个

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

它正在工作

昨天我花了2个小时来检查和修复这个错误,最后我发现我想解码的JSONstring是'\'斜线。 所以合理的做法是使用反斜杠函数或者类似于不同PL的东西。

当然,最好的方法是打印这个var的jill_decode,看看它变成了什么,如果它是null,你也可以使用json_last_error()函数来确定错误,它将返回整数,但这里是那些int描述:

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

在我的情况下,我得到了json_last_error()的输出作为数字4,所以它是JSON_ERROR_SYNTAX 。 然后,我去看看我想要转换的string,它在最后一行:

 '\'title\' error ...' 

之后,这真的只是一个简单的修复。

 $json = json_decode(stripslashes($response)); if (json_last_error() == 0) { // you've got an object in $json} 

我在MySQL中存储json-string存在这样的问题。 不知道为什么,但使用htmlspecialchars_decode berofe json_decode解决的问题。

非这些解决scheme为我工作。 DID最终工作的是通过将其保存到本地文件并使用Notepad ++打开来检查string编码。 我发现它是'UTF-16',所以我可以这样转换它:

 $str = mb_convert_encoding($str,'UTF-8','UTF-16'); 

也许你用$ ${来表示这些字符应该被引用。

我遇到了这个问题,当我调用一个soap方法来获取我的数据,然后返回一个jsonstring,当我试图做json_decode我只是保持null。

由于我使用nusoap来做soap调用,我试图返回jsonstring,现在我可以做一个json_decode,因为我真的用线程来获取我的数据的SOAP调用,我所做的就是在包含nusoap之前添加ob_start() ID做了我的电话genereate JSONstring,然后在返回我的JSONstring之前,我做了ob_end_clean(),并GOT MY PROBLEM固定:)

 //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); 

我不知道为什么? 但是这个工作:

 $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); 

没有utf8_encode() – 不工作

检查你的文件的编码。 我使用的是NetBeans,必须使用iso windows 1252编码为一个旧的项目和NetBeans使用此编码从那时起,每一个新的文件。 json_decode将返回NULL。 再次以UTF-8编码保存文件解决了我的问题。

在Notepad ++中,select编码(从顶部菜单),然后确保select“UTF-8编码”。

这将显示任何不应该在您的JSON,将导致json_decode失败的json_decode

尝试使用json_encodestring之前使用json_decode … idk如果将为您工作,但它为我做…我通过路线参数使用laravel 4 ajaxing。

 $username = "{username: john}"; public function getAjaxSearchName($username) { $username = json_encode($username); die(var_dump(json_decode($username, true))); } 

你应该试试json_last_error_msg() 。 它会给你错误信息,并告诉你什么是错的。 它是在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 

我有一个类似的问题,让它在json_encodestring周围添加''(单引号)后工作。 以下从我的js文件:

 var myJsVar = <?php echo json_encode($var); ?> ; -------> NOT WORKING var myJsVar = '<?php echo json_encode($var); ?>' ; -------> WORKING 

只是想过张贴,以防有人像我这样的绊倒在这篇文章:)