在PHP中的对象上使用json_encode(无论范围如何)

A. *_*ger 72 php json scope redbean

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

$related = $user->getRelatedUsers();
echo json_encode($related);
Run Code Online (Sandbox Code Playgroud)

现在,我只是遍历用户数组并单独将它们导出到数组中,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*
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是json_encode给我的:

php > echo json_encode($a);
{}
Run Code Online (Sandbox Code Playgroud)

我最后得到了这个:

    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).'}';   
        }   
    }   
Run Code Online (Sandbox Code Playgroud)

它需要数组充满这些对象或只是单个实例并将它们变成json - 我使用它而不是json_encode.我确信有些地方可以让它变得更好,但我希望json_encode能够检测何时根据其公开的接口迭代对象.

jon*_*ohn 144

对象的所有属性都是私有的.又...在他们班级范围之外不可用.

PHP解决方案<5.4

如果你想给你的序列化私有和保护对象的属性,你必须实现一个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()                
        ));
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

PHP> = 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()
        ];
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

更详细的写作

  • 当我传递这些对象时,json_encode()只输出"{}".不幸的是,不管是否将我的数组定义为关联的问题. (2认同)

ila*_*nco 41

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

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

所以PHP> = 5.4.0 的解决方案看起来应该是这样的:

class JsonObject implements JsonSerializable
{
    // properties

    // function called when encoded with json_encode
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*oij 8

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

json_encode( R::exportAll( $beans ) );
Run Code Online (Sandbox Code Playgroud)


小智 5

以下代码对我有用:

public function jsonSerialize()
{
    return get_object_vars($this);
}
Run Code Online (Sandbox Code Playgroud)