我正在尝试将对象列表输出为 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 能够检测到何时根据其暴露的接口(interface)迭代对象。
最佳答案
对象的所有属性都是私有(private)的。 aka...在他们的类(class)范围之外不可用。
PHP 解决方案 >= 5.4
使用新的 JsonSerializable
接口(interface)提供您自己的 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解决方案
如果您确实想序列化您的私有(private)和 protected 对象属性,您必须在您的类中实现一个 JSON 编码函数,该函数在数据结构上使用 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 - 在 PHP 中的对象上使用 json_encode(无论范围如何),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697656/