在PHP中使用json_encode对象(不pipe范围)

我试图输出对象的列表作为JSON,并想知道是否有办法使对象可用于json_encode ? 我得到的代码看起来像

 $related = $user->getRelatedUsers(); echo json_encode($related); 

现在,我只是迭代用户数组,并将它们单独导出到数组中,以便json_encode为我变成可用的json。 我已经尝试使对象迭代,但json_encode似乎只是跳过它们。

编辑 :这里的var_dump();

 php > var_dump($a); object(RedBean_OODBBean)#14 (2) { ["properties":"RedBean_OODBBean":private]=> array(11) { ["id"]=> string(5) "17972" ["pk_UniversalID"]=> string(5) "18830" ["UniversalIdentity"]=> string(1) "1" ["UniversalUserName"]=> string(9) "showforce" ["UniversalPassword"]=> string(32) "" ["UniversalDomain"]=> string(1) "0" ["UniversalCrunchBase"]=> string(1) "0" ["isApproved"]=> string(1) "0" ["accountHash"]=> string(32) "" ["CurrentEvent"]=> string(4) "1204" ["userType"]=> string(7) "company" } ["__info":"RedBean_OODBBean":private]=> array(4) { ["type"]=> string(4) "user" ["sys"]=> array(1) { ["idfield"]=> string(2) "id" } ["tainted"]=> bool(false) ["model"]=> object(Model_User)#16 (1) { ["bean":protected]=> *RECURSION* } } } 

这是json_encode给我的:

 php > echo json_encode($a); {} 

我结束了这个:

  function json_encode_objs($item){ if(!is_array($item) && !is_object($item)){ return json_encode($item); }else{ $pieces = array(); foreach($item as $k=>$v){ $pieces[] = "\"$k\":".json_encode_objs($v); } return '{'.implode(',',$pieces).'}'; } } 

它需要数组充满这些对象或只是单个实例,并把它们变成json – 我使用它而不是json_encode。 我确信有些地方我可以做得更好,但我希望json_encode能够检测何时基于其暴露的接口来遍历对象。

在RedBeanPHP 2.0中,有一个批量导出函数,将整个bean的集合转换为数组。 这适用于JSON编码器。

 json_encode( R::exportAll( $beans ) ); 

你的对象的所有属性都是私有的。 又名…在class级范围以外不可用。

PHP的解决scheme<5.4

如果您想要序列化您的私有和受保护的对象属性,则必须您的类中实现JSON编码函数,该函数您为此创build的数据结构上利用json_encode()

 class Thing { ... public function to_json() { return json_encode(array( 'something' => $this->something, 'protected_something' => $this->get_protected_something(), 'private_something' => $this->get_private_something() )); } ... } 

PHP的解决scheme> = 5.4

使用新的JsonSerializable接口来提供您自己的json表示以供json_encode

 class Thing implements JsonSerializable { ... public function jsonSerialize() { return [ 'something' => $this->something, 'protected_something' => $this->get_protected_something(), 'private_something' => $this->get_private_something() ]; } ... } 

更详细的写法

在PHP> = 5.4.0中,有一个将对象序列化为JSON的新接口: JsonSerializable

只需在你的对象中实现接口并定义一个JsonSerializable方法,当你使用json_encode时候会调用JsonSerializable方法。

所以PHP> = 5.4.0的解决scheme应该如下所示:

 class JsonObject implements JsonSerializable { // properties // function called when encoded with json_encode public function jsonSerialize() { return get_object_vars($this); } } 

我没有看到这个提到,但豆有一个名为getProperties()的内置方法。

所以,要使用它:

 // What bean do we want to get? $type = 'book'; $id = 13; // Load the bean $post = R::load($type,$id); // Get the properties $props = $post->getProperties(); // Print the JSON-encoded value print json_encode($props); 

这输出:

 { "id": "13", "title": "Oliver Twist", "author": "Charles Dickens" } 

现在更进一步。 如果我们有一个bean的数组…

 // An array of beans (just an example) $series = array($post,$post,$post); 

…然后我们可以做到以下几点:

  • foreach循环foreach数组。

  • 用bean的属性数组replace每个元素(一个bean)。

所以这…

 foreach ($series as &$val) { $val = $val->getProperties(); } print json_encode($series); 

输出这个:

 [ { "id": "13", "title": "Oliver Twist", "author": "Charles Dickens" }, { "id": "13", "title": "Oliver Twist", "author": "Charles Dickens" }, { "id": "13", "title": "Oliver Twist", "author": "Charles Dickens" } ] 

希望这可以帮助!

以下代码为我工作:

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

我通常在我的对象中包含一个小函数,允许我将其转储为数组或json或xml。 就像是:

 public function exportObj($method = 'a') { if($method == 'j') { return json_encode(get_object_vars($this)); } else { return get_object_vars($this); } } 

无论如何, get_object_vars()对你来说可能是有用的。

 $products=R::findAll('products'); $string = rtrim(implode(',', $products), ','); echo $string; 

对于一组对象,我使用类似这样的东西,而遵循php <5.4的自定义方法:

 $jsArray=array(); //transaction is an array of the class transaction //which implements the method to_json foreach($transactions as $tran) { $jsArray[]=$tran->to_json(); } echo json_encode($jsArray);