今天我不得不处理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虚拟机上。另一个运行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——没有问题需要报告。