我使用的是Doctrine 2和zend framework 1.11。公共属性在Doctrine 2中是不受鼓励的,所以我将我的实体属性设置为私有的。然而,我刚刚了解到Zend_Json::encode()和json_encode()不会看到私有/受保护的属性,因此不会将它们添加到它们的输出中。因此,当我使用,和var_dump,我得到一个空集,如字符串(4)“[{}]"。原来我必须写我自己的函数来做编码。我希望有人有一个解决方案,我可以用来代替。
5us2dqdw1#
将成员变量设为private的全部目的是防止它们对任何外部代码可见(序列化是一个例外,因为整个对象需要在会话之间恢复)。您也许应该使用方法“encode”创建一个接口“encodeable”,而不是json_encoding这个对象。这将返回该对象所需的任何成员的json编码字符串。这给了您额外的控制,因为您可以选择要序列化的成员,甚至对它们执行操作以序列化其他数据,而不是序列化所有成员。实际上,您可以实现直接与json_encode一起工作的JsonSerializable接口。
json_encode
JsonSerializable
class MyClass implements \JsonSerializable { public function jsonSerialize() { return get_object_vars($this); } } $myObject = new MyClass(); echo json_encode($myObject);
blmhpbnm2#
我相信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; } }
icomxhvb3#
可以在将对象传递到json_encode()之前对其进行serialize()
bxfogqkk4#
在类中创建一个方法:
function serialize(){ return json_encode(get_object_vars ($this)); }
4条答案
按热度按时间5us2dqdw1#
将成员变量设为private的全部目的是防止它们对任何外部代码可见(序列化是一个例外,因为整个对象需要在会话之间恢复)。
您也许应该使用方法“encode”创建一个接口“encodeable”,而不是json_encoding这个对象。这将返回该对象所需的任何成员的json编码字符串。这给了您额外的控制,因为您可以选择要序列化的成员,甚至对它们执行操作以序列化其他数据,而不是序列化所有成员。
实际上,您可以实现直接与
json_encode
一起工作的JsonSerializable
接口。blmhpbnm2#
我相信php 5.4有JsonSerializable,这应该会让事情变得更简单,但我使用的是php 5.3.8.我还没有尽可能多地测试它,我想我会满足于让我的属性公开,但这似乎对我自己的类有效:
icomxhvb3#
可以在将对象传递到json_encode()之前对其进行serialize()
bxfogqkk4#
在类中创建一个方法: