在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);
}
}
答案 0 :(得分:1)
您可以通过实施JsonSerializable为您的课程提供自定义的json编码格式。
在你的情况下,你只需要让属性实现它并给它一个jsonSerialize方法,它返回$ this->属性。
答案 1 :(得分: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"}