奇怪的行为:json_encode()产生依赖于输入的无效json

时间:2012-03-07 21:28:26

标签: php json syntax syntax-error quotes

今天我不得不处理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 );
    
  4. 问题:

    返回的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的虚拟机产生了正确的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);
    

1 个答案:

答案 0 :(得分:0)

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

$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 - 无需报告任何问题。