在 PHP 中的对象上使用 json_encode(不考虑范围)

2022-01-04 00:00:00 json scope php redbean

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

I'm trying to output lists of objects as json and would like to know if there's a way to make objects usable to json_encode? The code I've got looks something like

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

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

Right now, I'm just iterating through the array of users and individually exporting them into arrays for json_encode to turn into usable json for me. I've already tried making the objects iterable, but json_encode just seems to skip them anyway.

编辑:这是 var_dump();

edit: here's the 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 给我的:

and here's what json_encode gives me:

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 能够根据对象暴露的接口检测何时迭代它.

It takes arrays full of those objects or just single instances and turns them into json - I use it instead of json_encode. I'm sure there are places I could make it better, but I was hoping that json_encode would be able to detect when to iterate through an object based on its exposed interfaces.

推荐答案

在 RedBeanPHP 2.0 中有一个批量导出功能,可以将整个 bean 集合转换为数组.这适用于 JSON 编码器..

In RedBeanPHP 2.0 there is a mass-export function which turns an entire collection of beans into arrays. This works with the JSON encoder..

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

相关文章