PHP对象+;使用JSON_编码将集合转换为JSON

PHP对象+;使用JSON_编码将集合转换为JSON,php,oop,collections,json,Php,Oop,Collections,Json,在PHP中,我有一个包含属性集合的product对象。json_encode产生以下结果: {"id":"123","name":"abc","attributes":{"attributes":[{"key":"sku","value":"xyz"}]}} 两次列出的“属性”是多余的。构造对象集合以使json干净的最佳方法是什么 class Product { public $id; public $name; public $attributes; pu

在PHP中,我有一个包含属性集合的product对象。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);
    }
}

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


在您的例子中,您只需要让属性实现它,并给它一个jsonSerialize方法,该方法返回$this->Attributes。

我只需要使用一个关联数组

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>';

很好的解决方案。然而,只有在PHP5.4上可用,我们在5.3上。在这种特定情况下,这将起作用。然而,这是一个更大图景的简化版本。对我们来说,更好的方法是继续使用对象/集合,并找出一个自定义json输出。如果不知道您的具体需求,很难说。我添加了一种使用变量实现Attributes类的方法。它与您的Attributes类不完全兼容,因为它不允许多个属性使用同一个键。深入挖掘。默认情况下,json_编码对象/集合的方式很好。属性是我们的例外,在升级到PHP9.4之前,这是一个很好的解决方案。
{"sku":"xyz","foo":"bar"}
{"foo":"bar"}