【问题标题】:PHP Object+Collections to JSON Using json_encodePHP 对象+集合到 JSON 使用 json_encode
【发布时间】:2012-08-17 13:05:39
【问题描述】:

在 PHP 中,我有一个包含属性集合的产品对象。 json_encode 产生这个:

{"id":"123","name":"abc","attributes":{"attributes":[{"key":"sku","value":"xyz"}]}}

两次列出的“属性”是多余的。构造对象集合以使 json 干净的最佳方法是什么?

class Product {

    public $id;
    public $name;
    public $attributes;

    public function __construct()
    {
        $this->attributes = new Attributes();
    }

    public function get($id)
    {
        $this->id = "123";
        $this->name = "abc";
        $attribute = new Attribute("sku", "xyz");
        $this->attributes->add($attribute);
    }
}

class Attributes
{
    public $attributes;

    public function __construct()
    {
        $this->attributes = array();
    }

    public function add($attribute)
    {
        array_push($this->attributes, $attribute);
    }
}

class Attribute
{
    public $key;
    public $value;

    public function __construct($key, $value)
    {
        $this->set($key, $value);
    }
}

【问题讨论】:

    标签: php oop collections json


    【解决方案1】:

    我只会使用关联数组。

    class Product {
    ...
        public $attributes=array();
        ...
        public function get($id)
        {
            ...
            $this->attributes["sku"]="xyz";
            $this->attributes["foo"]="bar";
        }
    }
    

    json_encode() 应该产生如下内容:

    {"id":"123","name":"abc","attributes":{"sku":"xyz","foo":"bar"}}
    

    或使用可变变量:

    class Attributes
    {
        public function add($key,$value)
        {
            $this->{$key}=$value;
        }
        public function drop($key)
        {
            unset($this->{$key});
        }
    }
    
    $a=new Attributes();
    $a->add('sku','xyz');
    $a->add('foo','bar');
    echo json_encode($a).'<br>';
    $a->drop('sku');
    echo json_encode($a).'<br>';
    

    输出:

    {"sku":"xyz","foo":"bar"}
    {"foo":"bar"}
    

    【讨论】:

    • 这适用于这种特定情况。然而,这是一个更大图景的简化版本。更好地为我们保留对象/集合并找出自定义 json 输出。
    • 不知道您的具体要求很难说。我添加了一种使用可变变量实现 Attributes 类的方法。它与您的 Attributes 类不完全兼容,因为它不允许多个属性具有相同的键。
    • 深入挖掘。 json_encode 默认编码对象/集合的方式很好。属性是我们的例外,在我们升级到 PHP 9.4 之前这是一个很好的解决方案。
    【解决方案2】:

    您可以通过实现JsonSerializable 为您的类提供自定义的 json 编码格式。

    在你的情况下,你只需要让 Attributes 实现它并给它一个返回 $this->attributes 的 jsonSerialize 方法。

    【讨论】:

    • 很好的解决方案。但是,仅在 PHP 5.4 上可用,我们在 5.3 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2012-07-25
    • 2016-07-26
    • 2021-12-13
    相关资源
    最近更新 更多