【问题标题】:Strange behaviour: json_encode() producing invalid json dependent on input奇怪的行为:json_encode() 根据输入产生无效的 json
【发布时间】:2012-03-25 10:41:02
【问题描述】:

今天我不得不处理 php 的 json_encode() 的一些令人毛骨悚然的奇怪行为,我无处可读。

简而言之:

  1. 获取数据库的一行
  2. 构建一个 stdClass 对象并在其中存储一些数据
  3. 使用 json_encode() 对其进行编码

    $obj = new stdClass();
    $obj->a = "foo";
    $obj->b = "bar";
    $obj->c = "doo";
    $obj->d = "baa";
    json_encode( $obj );
    

问题:

返回的 JSON 有问题:第二个(最后一个,但只有这个!)变量被合并到前一个的字符串值中。

例如它看起来像:

{"a": "foo", "b": "bar", "c": "doo', 'd': 'baa"}
                                  ^-------^

当然,我已经将要传递给 json_encode() 的对象 var_dumped()... 什么都没有!一切都很好,完全符合预期。所有的变量都是正确的,所有的值都是字符串。

但是,这还不够。玩弄这个,我发现,改变我将值存储到对象中的顺序解决了这个问题:

$obj->d = "baa";
$obj->c = "doo";

没有产生错误。

现在我只是更改了数据库表的列顺序。但我想知道,这个从未见过的错误是从哪里来的,并最终报告它。

该错误仅出现在运行 PHP 5.3.6 的 Debian-VM 上。另一个运行 PHP 5.3.3 的 VM 生成了正确的 JSON,就像运行 PHP 5.3.8 的 Mac OS X Lion 的集成网络服务器一样。

我的问题

有人也遇到过这个问题吗?

来自德国的问候!

原代码

$obj = new stdClass();
$obj->Id = '35';
$obj->EventsCategories_Id = '8';
$obj->Name = 'Blubber';
$obj->OrderValue = '2';
var_dump($obj);
json_encode($obj);

【问题讨论】:

  • 我刚刚在 PHP 5.3.8 上对此进行了测试,我可以确认得到了正确的输出 string(41) "{"a":"foo","b":"bar","c":"doo","d":"baa"}"。只是把它扔在那里以确认 5.3.8 工作正常。
  • 我刚刚安装了 PHP 5.3.6(CLI、Windows、VC9)来运行您的相同代码和原始代码,但我仍然得到了正确的输出。我尝试了线程安全和非线程安全的版本,仍然得到相同的结果。
  • 您能否发布var_dump($obj)var_dump(json_encode($obj)) 在您的环境中的结果?
  • 很好的问题/格式。但也无法使用5.3.6-13ubuntu3.6+suhosin(接近您的 Debian 版本)重现它。您绝对应该将此作为错误提交到 php.netdebian.org

标签: php json syntax syntax-error quotes


【解决方案1】:

我不知道这是否有帮助,但是运行以下代码会产生任何不同的结果吗?

$obj = new stdClass();
$obj->Id = '35';
$obj->EventsCategories_Id = '8';
$obj->Name = 'Blubber';
$obj->OrderValue = '2';

// convert the stdClass object to an array
$obj = (array) $obj;
var_dump($obj);
json_encode($obj);

我认为要问的相关问题是:

  • 内部 PHP 问题(可能,但不太可能)
  • 由于某些环境问题引起的问题(图书馆冲突?)
  • 缺少配置选项

虽然我非常怀疑你做错了什么(我的意思是,这是一个简单的用例,你的代码没有任何问题),也许你可以尝试一些其他的事情......

例如,尝试将第二个参数附加到 json_encode 函数:

echo json_encode($obj, JSON_FORCE_OBJECT);

您能否发布这两个简短实验的结果?这个问题确实很奇怪。我正在运行 PHP 5.3.1,它会根据您的示例生成语法正确的 JSON - 没有问题需要报告。

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2021-09-15
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多