我正在使用doctrine 2和zend framework 1.11。在Doctrine 2中不鼓励公共属性,因此我将我的实体属性设为私有。但是我刚刚了解到Zend_Json :: encode()和json_encode()不会看到私有/受保护的属性,因此不会在它们的输出中添加它们。
因此当我使用和var_dump时,我得到一个空集,例如string(4)“[{}]”。
事实证明我必须编写自己的函数来进行编码。我希望有人有一个我可以使用的解决方案。
答案 0 :(得分:6)
将成员变量设置为私有的全部意义是防止它们对任何外部代码可见(序列化是一个例外,因为整个对象需要在会话之间恢复)。
您可能应该使用方法“encode”创建一个“可编码”接口,而不是对此对象进行json_encoding。这将返回此对象所需的任何成员的json编码字符串。这为您提供了额外的控制,因为您可以选择要序列化的成员,甚至可以对它们执行操作以序列化其他数据,而不是序列化所有成员。
实际上,您可以使用直接与json_encode
一起使用的JsonSerializable
界面。
class MyClass implements \JsonSerializable
{
public function jsonSerialize()
{
return get_object_vars($this);
}
}
$myObject = new MyClass();
echo json_encode($myObject);
答案 1 :(得分:2)
我相信php 5.4有JsonSerializable,这应该会让事情变得更容易,但我正在使用php 5.3.8。我没有尽可能多地对此进行测试,并认为我会满足于将我的属性公开,但这似乎适用于我自己的课程:
class JSONEncoder{
public function json_encode($object){
return json_encode($this->getFields($object));
}
private function getFields($classObj){
$fields = array();
$reflect = new ReflectionClass($classObj);
$props = $reflect->getProperties();
foreach($props as $property){
$property->setAccessible(true);
$obj = $property->getValue($classObj);
$name = $property->getName();
$this->doProperty($fields, $name, $obj);
}
return $fields;
}
private function doProperty(&$fields, $name, $obj){
if (is_object($obj)){
$fields[$name] = $this->getFields($obj);
return;
}
if (is_Array($obj)){
$arrayFields = Array();
foreach ($obj as $item){
$key = key($obj);
$this->doProperty($arrayFields, $key, $item);
next($obj);
}
$fields[$name] = $arrayFields;
}
else
$fields[$name] = $obj;
}
}
答案 2 :(得分:0)
您可以在将对象传递给json_encode()
之前serialize()答案 3 :(得分:0)
在你的班级中创建一个方法:
function serialize(){
return json_encode(get_object_vars ($this));
}