【问题标题】:json_decode returns NULL after webservice calljson_decode 在 webservice 调用后返回 NULL
【发布时间】:2010-10-15 21:47:31
【问题描述】:

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

我的 php 应用程序调用 php web 服务。 Web 服务返回如下所示的 json:

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

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

$data = json_decode($foo, true)

但它返回NULL:

var_dump($data):
NULL

我使用 php5。 Web服务响应的Content-Type:"text/html; charset=utf-8"(也尝试使用"application/json; charset=utf-8"

可能是什么原因?

【问题讨论】:

  • 我遇到了同样的问题,this answer 为我工作。

标签: php json


【解决方案1】:

嗯,我有一个类似的问题,问题是服务器中的 PHP 魔术引号......这是我的解决方案:

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

【讨论】:

  • 非常感谢巴勃罗的回答!你为我节省了很多时间!!
  • 干杯哥们,没想到魔术引号会引起这样的问题,差点对着显示器大喊大叫。干杯。
  • @Pablo 为什么在 get_magic_quotes_gpc() 返回 true 时调用 stripslashes()?它对我有用,但是在 get_magic_quotes_gpc 之前添加(!)之后,如果 get_magic_quotes_gpc 不返回 true,我会调用 spripslashes()
  • @jey 嘿,不管用什么都好。就我而言,上面的确切代码解决了我的问题
  • 即使魔术引号已关闭,我仍然需要stripslashes。有什么解释吗?
【解决方案2】:

编辑: 刚刚对 OP 提供的字符串进行了一些快速检查。花括号前面的小“字符”是UTF-8 B(yte) O(rder) M(ark) 0xEF 0xBB 0xBF。不知道为什么这个字节序列在这里显示为

本质上,您从中获取数据的系统会发送以 UTF-8 编码的数据,并在数据前面加上 BOM。在将字符串放入 json_decode() 之前,您应该删除字符串的前三个字节(substr($string, 3) 可以)。

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

正如Kuroki Kaze 所发现的,这个角色肯定是json_decode 失败的原因。给定形式的字符串不是正确的 JSON 格式结构(请参阅RFC 4627

【讨论】:

  • 我不这么认为。这是一个大括号。我认为每个 JSON 结构都应该以大括号开头。
  • 不,不是大括号 - 在大括号之前有一个字符。
  • 我认为 SO 的格式试图让这个问题难以回答。 :-p
  • -> 好的,Notepad++ 让我看到了这个字符。我的 FF3 不显示它...非常感谢! :)
  • @StefanGehrig 这是一个老问题/答案,但我在这里找到了一个更好的解决方案来删除 UTF-8 BOM:stackoverflow.com/a/15423899/1128918。由于它使用preg_replace 而不是(mb_)substr,它将处理带有和不带有BOM 的字符串。如果您可以更新答案,那就太好了。 ;)
【解决方案3】:

调试时打印最后一个 json 错误。

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;
还可以使用 json.stringify() 函数来仔细检查您的 JSON 语法。

【讨论】:

  • 我们的一位用户刚刚遇到这个问题:PHP.net 错误,这是在 5.3 中引入的,所以可以确认@MdOliya
  • 这对我帮助很大!
【解决方案4】:

上述解决方案均不适合我,但 html_entity_decode($json_string) 成功了

【讨论】:

  • 这适用于存储在 mysql utf8 表中的 json 字符串。我怀疑存储到 mysql 时会发生一些事情。
  • 谢谢!!我花了几个小时尝试不同的解决方案,这是唯一有效的方法。
  • 这对我也有用。它需要解码存储在 Wordpress 中的 JSON。
【解决方案5】:

试试这个

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

【讨论】:

  • 嗨 Olafur,utf8_encode 将一些奇怪的字符写入字符串的开头。 utf8_decode 写入一个 ?到字符串的开头。这只是一种解决方法,但它有效。我确信有更好的方法: $foo = utf8_decode($result->data); json_decode(str_replace("?", "", $foo), true);
  • 这对我有用,所有其他提到的答案都不起作用。
【解决方案6】:

确保如果您通过 POST / GET 发送数据,服务器没有转义引号

$my_array = json_decode(str_replace ('\"','"', $json_string), true);

【讨论】:

  • 老兄......你让我很开心。这个问题要了我的命!
【解决方案7】:
"{"action":"set","user":"123123123123","status":"OK"}"

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

【讨论】:

  • 我找不到一个小撇号。双引号后的第一个符号是大括号。
【解决方案8】:

我在实时站点中遇到了类似的问题。在我的本地站点中,它运行良好。为了修复相同的问题,我刚刚添加了以下代码

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

【讨论】:

  • 这对我有用,不是 UTF-8 编码中的 BOM,而是添加了一些斜杠。
【解决方案9】:

我只是放了这个

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

它正在工作

【讨论】:

    【解决方案10】:

    昨天我花了 2 个小时检查和修复这个错误,最后我发现在我想要解码的 JSON 字符串中是“\”斜杠。所以合乎逻辑的做法是使用 stripslashes 函数或类似于不同 PL 的东西。

    当然,最好的方法是打印这个 var,看看它在 json_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。然后我去看看我想转换的字符串它自己,它在最后一行:

    '\'title\' error ...'
    

    在那之后真的只是一个简单的修复。

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

    【讨论】:

      【解决方案11】:

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

      【讨论】:

        【解决方案12】:

        这些解决方案都不适合我。 DID 最终的工作是通过将字符串编码保存到本地文件并使用 Notepad++ 打开来检查字符串编码。 我发现它是“UTF-16”,所以我可以这样转换:

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

        【讨论】:

          【解决方案13】:

          也许你使用 $ ${:这些字符应该被引用。

          【讨论】:

            【解决方案14】:

            我遇到了这个问题,当我调用一个soap方法来获取我的数据,然后返回一个json字符串时,当我尝试执行json_decode时,我总是得到null。

            由于我使用 nusoap 进行肥皂调用,我尝试只返回 json 字符串,现在我可以进行 json_decode,因为我真的需要通过 SOAP 调用获取我的数据,我所做的是在之前添加 ob_start()包括 nusoap,id 我的调用生成了 json 字符串,然后在返回我的 json 字符串之前我做了 ob_end_clean(),并解决了我的问题 :)

            示例

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

            【讨论】:

              【解决方案15】:

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

              $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() - 不工作

              【讨论】:

                【解决方案16】:

                检查文件的编码。我使用的是 netbeans,并且不得不对旧项目使用 iso windows 1252 编码,而从那时起,netbeans 对每个新文件都使用这种编码。 json_decode 然后将返回 NULL。使用 UTF-8 编码再次保存文件解决了我的问题。

                【讨论】:

                  【解决方案17】:

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

                  这将显示任何不应该出现在您的 json 中的字符,这些字符会导致 json_decode 失败。

                  【讨论】:

                    【解决方案18】:

                    在使用 json_decode 之前尝试在字符串上使用 json_encode...idk 如果对您有用,但对我有用...我正在通过路由参数使用 laravel 4 ajaxing。

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

                    【讨论】:

                      【解决方案19】:

                      你应该试试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
                      

                      【讨论】:

                        【解决方案20】:

                        在应用 PHP 相关解决方案之前,请验证您的 JSON 格式。这可能是问题所在。试试下面的在线 JSON 格式验证器。如果您的 JSON 格式无效,请先更正它,因为 PHP 不会解码无效的 JSON 字符串。

                        https://jsonformatter.org/

                        【讨论】:

                          【解决方案21】:

                          就我而言,当我打印到屏幕上时,json 很好,我使用json_deocode() 函数复制和解码。它工作正常。但是,当我尝试将 jsonString 直接放在函数中时,它返回 null,因为引号就像这些 &amp;quot; 一样。所以我使用了htmlspecialchars_decode() 函数,现在它工作正常。 我是新来的,所以如果我在写答案时犯了任何错误,那么很抱歉。我希望它会帮助别人。

                          【讨论】:

                            【解决方案22】:

                            Laravel 具体回答: 我在 Laravel 中遇到了同样的问题。这对我有用

                            $result = json_decode($result->getContent(), true);
                            

                            【讨论】:

                            • 我不认为这是针对所提问题的合法解决方案。充其量似乎是对不同问题的正确答案。像这样的帖子会使 Stack Overflow 页面不必要地冗长/臃肿。
                            • @mickmackusa 我没有添加这个来获得积分。而是帮助 PHP 开发者的同胞。因为,Laravel 是一个著名的 PHP 框架,我相信很多像我一样的人最终会登陆这个页面,面临和我一样的问题。我不同意你说这不合法。我特别用粗体添加了这是 Laravel 特定的答案。这只是为了在一天结束时提供帮助。如果它让您满意,我可以删除它。干杯。
                            • 你可以为所欲为。由于之前评论的原因,我已经投票删除了这个答案。
                            【解决方案23】:

                            我遇到了类似的问题,在 json_encode 字符串周围添加 '' (单引号)后让它工作。来自我的 js 文件:

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

                            只是想发布它,以防有人像我一样偶然发现这篇文章:)

                            【讨论】:

                            • 这没有意义,你有一个字符串,你需要评估才能从 JS 中使用。问题是关于 json_encode 调用失败。
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-04-27
                            相关资源
                            最近更新 更多