在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);