【问题标题】:json_decode() returns null issuesjson_decode() 返回空问题
【发布时间】:2011-03-07 19:58:12
【问题描述】:

我的 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() 中会发生什么变化

任何帮助将不胜感激(!)。

谢谢! 马特

【问题讨论】:

  • 我使用JSONLint 来格式化您的 JSON。这也是一个验证 JSON 的好网站。
  • 天哪。谢谢,我没有看到那个选项 - 我只是检查了一下,看起来它也在 JSONLint 中验证过:-/
  • PHP > 5.3.0 有 json_last_error() 来帮助调试错误的 JSON。 php.net/json_last_error
  • 当 JSONLint 验证失败时,确保制表符和换行符硬编码为 \n\t。字符串中的制表符不是有效的 JSON,祝你好运在一大段文本中区分制表符和几个空格;)(我只是花了太多时间注意到那个制表符......)

标签: php json phpunit


【解决方案1】:

多么可怕的调试会话.. 好消息.. 我想通了..

我开始使用 AJAX 查看它并使用 Firebug 记录它...结果 json_decode(或顺便说一下 eval)无法处理 &amp;quot;,这是 PHPUnit 发回的(加油 Sebastian!),所以修复它:

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

现在我认为它们是相同的..也许有人可以启发我..

【讨论】:

  • 但是我在你引用的 JSON 中没有看到任何 quot s?
  • 嗯...我的 json 来自 print_r() 语句,该语句必须在我复制和粘贴之前转换了符号...
  • 我遇到了同样的问题 - var_dump 显示了有效的 JSON,但查看页面的源代码发现了讨厌的 &amp;quot; - 这是从 WordPress 帖子保存时,所以请注意它可能会编码您的 @ 987654325@'d 对象与&amp;quot; - 非常令人沮丧。
  • 非常感谢。在过去的几个小时里,我的头一直在疼,试图弄清楚这一点。同意这是多么令人沮丧。
  • 我们也可以$json = html_entity_decode($json);
【解决方案2】:

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

【讨论】:

  • json_decode(stripslashes($response)); 而不是 PHP 5.2 的 json_decode($response); - 找到你的答案。这个解决方案花了我两个小时的时间,非常感谢!
  • 问题是如果我的数据包含斜线,它也会被删除。马特的解决方案,在$json = json_decode($transferString,true); 之后调用$json = str_replace('&amp;quot;', '"', $json) 终于奏效了。
【解决方案3】:

当我使用时:

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() 对其进行解析。

【讨论】:

  • 是的,这也必须修复..哈哈。不过我照顾了那个。
  • 哦,无论出于何种原因,只是添加逗号和括号并不能解决它(请参阅我的答案),但不知道为什么 - 也许这是我在代码中所做的转换 @987654324 @到&amp;quot;
  • 您能说明一下您是如何从 PHPUnit 获取 JSON 的吗?我只是在做 --log-json file.json,然后在 PHP 中,类似 json_decode(file_get_contents("file.json"))。这也是你正在做的吗?我没有遇到和你一样的引号问题,但这可能是因为我们的测试用例之间的差异。
【解决方案4】:

自 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"  
}

【讨论】:

    【解决方案5】:

    你应该使用这个

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

    我用 PHP 5.3 对此进行了测试

    【讨论】:

      【解决方案6】:

      试试这个问题是这个 html_entity_decode($your value);

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

      【讨论】:

        【解决方案7】:

        尝试将错误报告设置为ALL,json_decode()应该会在转换失败的偏移处通知您。

        【讨论】:

        • 不.. 什么都不做.. :-(
        • 我添加了 error_reporting(E_ALL).. 这就是你的建议对吗??
        • 是的,我的意思是,我以前一直为我使用和工作:s
        【解决方案8】:

        塞巴斯蒂安关于 json 输出格式的有用帖子

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

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

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多