2011-08-17 160 views
2

数组所以假设我有这个zend_json包含对象

$arr = array(some object with property a,b,c,d,etc); 

和你打电话Zend_Json::encode($arr);

,而不是编码中它的对象为好,它只会返回一个编码的空数组:[{}]

这是一个史诗般的失败

我该如何告诉Zend_Json也编码数组中的对象,而不仅仅是retu RN此故障

##################### 编辑

好了,所以我实际上是在类此方法:

public function toJson(){ 
    $params = get_object_vars($this); 
    return Zend_Json::encode($params); 
} 

但它仍然只输出一个空数组

[{}]

编码自身工作的对象,但如果它是一个数组内

...

+0

他们是受保护的或私人财产? –

回答

2

如果您是默认编码PHP对象的编码机制可以 只能访问这些对象的公共属性。当在要编码的对象上实现一个方法toJson() 时,Zend_Json调用此方法,并且 需要该对象返回其内部 状态的JSON表示。

http://framework.zend.com/manual/en/zend.json.advanced.html#zend.json.advanced.objects2

更新:这是一段代码我试过了。它工作正常,我觉得你的对象属性没有价值。

class Hello 
{ 
    private $hello = 'Hello'; 
    public $wolrd = ' World'; 

    public function getProperties() 
    { 
      return get_object_vars($this); 
    } 

} 
$json = new Zend_Json(); 
$hello = new Hello(); 
echo $json->encode(array($hello->getProperties())); 

结果:

[{"hello":"Hello","wolrd":" World"}] 

完全希望这将工作。来自帖子的一些想法;)http://blog.calevans.com/2008/02/21/zend_jsonencode-and-wth-are-all-my-properties/

+2

+ 1,toJson的一个简单实现就可以简单地创建一个新的stdClass,将非公共属性的值复制到这个对象中,然后返回'Zend_Json :: encode(myValueObject);' –

+0

参见编辑...... ............ –

+0

请参阅示例代码。 –

0

默认情况下Zend_Json :: encode方法使用PHP json_encode函数。您需要将Zend_Json :: $ useBuiltinEncoderDecoder设置为true,并在您的数组中的域对象中实现toJson方法。这个方法应该返回有效的json字符串。

class Foo 
{ 
    private $a; 
    private $b; 

    public function toJson() 
    { 
     return $json = Zend_Json::encode(array(
      'a' => $this->a; 
      'b' => $this->b 
     )); 
    } 
} 
Zend_Json::$useBuiltinEncoderDecoder = true; 
echo Zend_Json::encode(array(new Foo()));