奇怪的行为:json_encode()根据输入生成无效json


Strange behaviour: json_encode() producing invalid json dependent on input

今天我不得不处理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虚拟机上。另一个运行PHP 5.3.3的虚拟机生成了正确的JSON,就像Mac OS X Lion的集成Web服务器运行PHP 5.3.8一样。

我的问题

有人也经历过这个问题吗

来自德国的问候!

原始代码

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

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

$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——没有问题需要报告。