首页 文章

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

提问于
浏览
2

今天我不得不处理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 回答

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

相关问题