今天我不得不处理php的 json_encode() 的一些奇怪的行为,我无处可读 .
简而言之:
-
获取数据库的一行
-
构建一个 stdClass -object并在其中存储一些数据
-
使用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"}
^-------^
当然我已经将var_dumped()传递给json_encode()的对象......没有!一切都很好,完全符合预期 . 所有的变量都是正确的,所有的值都是字符串 .
但是,这还不够 . 我发现,改变顺序,我将值存储到对象中解决了问题:
$obj->d = "baa";
$obj->c = "doo";
没有产生错误 .
现在我只是改变了数据库表的列的顺序 . 但我想知道,这个从未见过的bug来自哪里并最终报告它 .
该错误仅出现在运行PHP 5.3.6的Debian-VM上 . 运行PHP 5.3.3的另一个VM生成了正确的JSON,就像运行PHP 5.3.8的Mac OS X Lion的集成Web服务器一样 .
我的问题
有没有人遇到过这个问题?
来自德国的问候!
原始代码
$obj = new stdClass();
$obj->Id = '35';
$obj->EventsCategories_Id = '8';
$obj->Name = 'Blubber';
$obj->OrderValue = '2';
var_dump($obj);
json_encode($obj);
1 回答
我不知道这是否有帮助,但运行以下代码会产生任何不同的结果吗?
我认为要问的相关问题是:
内部PHP问题(可能,但不太可能)
一些环境问题引起的问题(一个冲突的图书馆?)
缺少配置选项
虽然我非常怀疑你做错了什么(我的意思是,这是一个简单的用例,你的代码根本没有任何问题),也许你可以尝试其他一些东西......
例如,尝试将第二个参数附加到
json_encode
函数:echo json_encode($obj, JSON_FORCE_OBJECT);
你能发布这两个简短实验的结果吗?确实,这个问题很奇怪 . 我正在运行PHP 5.3.1并根据您的示例生成语法正确的JSON - 无需报告任何问题 .