【发布时间】:2012-03-25 10:41:02
【问题描述】:
今天我不得不处理 php 的 json_encode() 的一些令人毛骨悚然的奇怪行为,我无处可读。
简而言之:
- 获取数据库的一行
- 构建一个 stdClass 对象并在其中存储一些数据
-
使用 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.net 和 debian.org。
标签: php json syntax syntax-error quotes