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

标签 php json scope redbean

我正在尝试将对象列表输出为 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()                
        ));
    }
    ...
}

A more detailed writeup

关于php - 在 PHP 中的对象上使用 json_encode(无论范围如何),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697656/

相关文章:

php - 我只想显示日期为空的数据

java - 使用 add 属性将 JSONObject 添加到 JSONArray java

java - 将 Json 文件存储在 AngularJS 变量中以与 'ng-repeat' 一起使用

objective-c - 从 subview Controller 设置父 View Controller 类的属性值?

php - 如何使用 php 获取 $_GET 请求

javascript - AngularJS : Handling value with same input name

php - 当我在docker中使用composer时“Could not delete ./”

python - 需要一个类似字节的对象,而不是 'str' JSON 文件作为 STR 打开

Python 局部变量与全局变量

python - if __name__ == __main__ 的范围