相关疑难解决方法(0)

PHP:__ toString()和json_encode()不能很好地融合在一起

我遇到了一个奇怪的问题,我不知道如何解决它.我有几个类都是JSON对象的PHP实现.这是'问题的一个例子

class A
{
    protected $a;

    public function __construct()
    {
        $this->a = array( new B, new B );
    }

    public function __toString()
    {
        return json_encode( $this->a );
    }
}

class B
{
    protected $b = array( 'foo' => 'bar' );

    public function __toString()
    {
        return json_encode( $this->b );
    }
}

$a = new A();

echo $a;
Run Code Online (Sandbox Code Playgroud)

这个输出是

[{},{}]
Run Code Online (Sandbox Code Playgroud)

所需的输出是

[{"foo":"bar"},{"foo":"bar"}]
Run Code Online (Sandbox Code Playgroud)

问题是我依靠__toString()钩子来为我做我的工作.但它不能,因为json_encode()使用的序列化不会调用__toString().遇到嵌套对象时,它只是序列化公共属性.

那么,问题就变成了这样:有没有办法可以开发一个JSON类的托管接口,它既可以让我使用setter和getter来获取属性,也可以让我获得我想要的JSON序列化行为?

如果这是不明确的,这里是一个实现的例子就不会工作,因为__set()钩子只要求初始分配

class a
{
    public function __set( $prop, $value )
    {
        echo __METHOD__, PHP_EOL; …
Run Code Online (Sandbox Code Playgroud)

php serialization json

11
推荐指数
1
解决办法
8495
查看次数

将PHP对象图序列化/反序列化为JSON

我想将一个完整的PHP对象图序列化为JSON字符串表示,并将其反序列化为相同的PHP对象图.

以下是我考虑的选项摘要,以及它们不适合我的原因:

  • serialize()没有做我想要的,因为它使用特定于PHP的格式.我想要一种大多数语言广泛支持的格式,以及人类可读/可编辑的格式.

  • json_encode()没有做我想要的,因为它只做简单的值和数组,而不是对象.(我实际上是在我的实现中使用它,见下文.)

  • var_export()不处理循环引用,并且不执行我想要的操作(参见上文.)(请注意,我当前的实现也不处理循环引用 - 请参阅下面的注释和回复以澄清此问题.)

  • Sebastian Bergmann的Object Freezer是一个很好的实现,但它不能做我想要的 - 它使用很长的形式,并依赖于使用GUID填充序列化对象.

  • 序列化没有做我想要的 - 它实际上不执行序列化,它解析输出serialize()并产生不同的表示,例如XML,但无法解析该表示.(它也不支持JSON - XML格式很长,并不是我想要的.)

我现在有一个工作实现分享:

https://github.com/mindplay-dk/jsonfreeze

对象图的JSON表示如下所示:

{
    "#type": "Order",
    "orderNo": 123,
    "lines": [{
        "#type": "OrderLine",
        "item": "milk \"fuzz\"",
        "amount": 3,
        "options": null
    }, {
        "#type": "OrderLine",
        "item": "cookies",
        "amount": 7,
        "options": {
            "#type": "#hash",
            "flavor": "chocolate",
            "weight": "1\/2 lb"
        }
    }],
    "paid": true
}
Run Code Online (Sandbox Code Playgroud)

此方法旨在用于纯树结构聚合 - 不允许循环引用,也不允许对同一对象进行多次引用.换句话说,这不是通用的,例如serialize(),unserialize()任何PHP对象图的功能.

在我最初的方法中,我使用了一个序列化的表单,它基本上是一个基础0对象列表.列表中的第一个对象(编号0)是序列化对象图的根,任何其他对象按其找到的顺序存储.

在当前实现中,JSON表示类似于可能的扩展的原始树结构,使得实际使用JavaScript中的对象图的JSON表示成为可能.唯一的偏差是magic #type属性(前缀为#以防止与属性名冲突)和 …

php arrays serialization json reference

6
推荐指数
1
解决办法
4240
查看次数

标签 统计

json ×2

php ×2

serialization ×2

arrays ×1

reference ×1