webservice调用后,json_decode返回NULL

时间:2009-03-27 10:11:48

标签: php json

json_encodejson_decode有一种奇怪的行为,我无法找到解决方案:

我的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。 来自网络服务的响应的内容类型:"text/html; charset=utf-8"(也尝试使用"application/json; charset=utf-8"

可能是什么原因?

22 个答案:

答案 0 :(得分:74)

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

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

答案 1 :(得分:64)

修改 刚刚对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

答案 2 :(得分:33)

调试时打印最后一个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语法。

答案 3 :(得分:26)

上述解决方案都不适用于我,但是html_entity_decode($json_string)完成了这个技巧

答案 4 :(得分:19)

试试这个

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

答案 5 :(得分:7)

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

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

答案 6 :(得分:5)

"{"action":"set","user":"123123123123","status":"OK"}"
这个小撇号一开始 - 它是什么?双引号后的第一个符号。

答案 7 :(得分:4)

我在网站上遇到了类似的问题。在我的本地网站,它工作正常。为了解决这个问题,我刚刚添加了下面的代码

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

答案 8 :(得分:4)

我只是把这个

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

它正在运作

答案 9 :(得分:3)

昨天我花了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}

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

也许您使用的是$ ${:应该引用这些字符。

答案 13 :(得分:0)

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

https://jsonformatter.org/

答案 14 :(得分:0)

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

由于我使用nusoap进行soap调用,我试图返回json字符串,现在我可以执行json_decode,因为我真的需要使用SOAP调用来获取数据,我所做的是先添加ob_start()包括nusoap,id做了我的调用genereate json string,然后在返回我的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 :(得分:0)

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

答案 16 :(得分:0)

在使用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)));
}

答案 17 :(得分:0)

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

这将显示json中不应该导致json_decode失败的任何字符。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

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

答案 20 :(得分:-1)

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

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

答案 21 :(得分:-4)

我有一个类似的问题,在json_encode字符串周围添加''(单引号)后让它工作。从我的js文件开始:

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

只是想发布它以防万一有人像我一样偶然发现这个帖子:)