json_decode()返回null问题

时间:2010-06-24 13:44:05

标签: php json phpunit

我的JSON存在问题。它在PHP 5.3中正确返回(所以我不能使用json_last_error()),当我将字符串显式复制到json_decode(json_decode('{...}')时它会成功返回。它只在我通过时返回null作为变量的结果,我使用的是PHP 5.2,这就是我所需要的。

输出来自PHPUnit中的JSON日志记录:

[
    {
        "event": "suiteStart",
        "suite": "",
        "tests": 2
    },
    {
        "event": "suiteStart",
        "suite": "TagTestCase",
        "tests": 2
    },
    {
        "event": "test",
        "suite": "TagTestCase",
        "test": "TagTestCase::test_it",
        "status": "fail",
        "time": 0.00248718261719,
        "trace": [
            {
                "file": "\/UnitTest\/PHPUnit.php",
                "line": 98,
                "function": "run",
                "class": "PHPUnit_Framework_TestSuite",
                "type": "->",
                "args": [
                    {

                    }
                ]
            },
            {
                "file": "\/UnitTest\/PHPUnit.php",
                "line": 116,
                "function": "run",
                "class": "PHPUnit",
                "type": "->",
                "args": [

                ]
            },
            {
                "file": "\/UnitTest\/PHPUnit.php",
                "line": 212,
                "function": "__tostring",
                "class": "PHPUnit",
                "type": "->",
                "args": [

                ]
            }
        ],
        "message": "false assertionzzzzz.\nFailed asserting that <boolean:false> is true."
    },
    {
        "event": "test",
        "suite": "TagTestCase",
        "test": "TagTestCase::test_two",
        "status": "pass",
        "time": 0.00182914733887,
        "trace": [

        ],
        "message": ""
    }
]
编辑:这些是路径,我一直在探索 - 也许你是一个更好的探险家.. 三种可能有用的途径:

  • 在php 5.2然后5.3中json_decode()的不同之处是什么?他们改变了什么?
  • 其他人使用PHPUnit中的JSON,以及他们如何解析它。
  • 当您在变量中将其打印到屏幕并将其复制到json_decode()时会发生什么变化

任何帮助都会受到极大的赞赏。

谢谢! 马特

10 个答案:

答案 0 :(得分:20)

多么糟糕的调试会议......好消息......我想出来了..

我开始使用AJAX查看它并使用Firebug进行日志记录...事实证明,json_decode(或顺便说一句eval)无法处理&quot;,这是PHPUnit发回的内容(来吧塞巴斯蒂安!) ,所以要解决它:

$json = str_replace('&quot;', '"', $json);

现在我以为他们是一样的......也许有人可以开导我..

答案 1 :(得分:17)

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

答案 2 :(得分:4)

当我使用时:

phpunit --log-json file.json <test_file>

(使用PHPUnit 3.4.13),它创建的文件似乎不包含有效的JSON,

json文件包含“json”,它看起来像:

{...}{...}{...}{...}

而不是我期望看到的:

[{...},{...},{...},{...}]

不确定您遇到的问题是否相同,问题中的示例JSON输出似乎比我看到的更有效。

添加缺少的逗号和括号后,可以在PHP 5.2.10或PHP 5.3.2上使用json_decode()进行解析。

答案 3 :(得分:2)

试试这个问题就是这个html_entity_decode($你的价值);

 if(get_magic_quotes_gpc()){
   $param = stripslashes($row['your column name']);
 }else{
   $param = $row['your column name'];
}


$param = json_decode(html_entity_decode($param),true);
 $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;
print_r($param);

答案 4 :(得分:1)

你应该使用这个

$jsonstring = stripslashes(str_replace('\"', '"', $jsonstring));

我用PHP 5.3进行了测试

答案 5 :(得分:0)

尝试在ALL中设置错误报告,json_decode()应该在转换失败的偏移量中给出通知。

答案 6 :(得分:0)

Sebastian关于json输出格式的有用帖子

https://github.com/sebastianbergmann/phpunit/issues/142

使用Keith的建议将允许正确解析数据

答案 7 :(得分:0)

我注意到PHP版本5.14.12的这种行为,也可能适用于其他版本 当使用file_get_contents将JSON字符串加载到json_decode函数中时,我必须去除BOM字符,即UTF-8 EF BB BF才能正常工作。
比较两个字符串的长度 - 硬编码与传入的变量 - 如果它们不相同,这些字符可能是罪魁祸首。

答案 8 :(得分:0)

您可以在提交之前设置数据库字符集 - 解决我的问题:

$sql = $mysqli->set_charset("utf8");

答案 9 :(得分:0)

自PHP 7.3 起,json_decode函数将接受新的JSON_THROW_ON_ERROR选项,该选项将使json_decode引发异常,而不是在出错时返回null。


示例:

try {  
  json_decode("{", false, 512, JSON_THROW_ON_ERROR);  
}  
catch (\JsonException $exception) {  
  echo $exception->getMessage(); // displays "Syntax error"  
}