首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在PHP中对对象使用json_encode (与范围无关)

在PHP中对对象使用json_encode (与范围无关)
EN

Stack Overflow用户
提问于 2011-01-15 10:46:31
回答 9查看 132.3K关注 0票数 78

我正在尝试将对象列表输出为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能够根据公开的接口检测到何时遍历对象。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-05-20 15:32:02

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

json_encode( R::exportAll( $beans ) );
票数 8
EN

Stack Overflow用户

发布于 2011-01-15 10:50:30

对象的所有属性都是私有的。又名..。在其类的作用域之外不可用。

PHP >= 5.4的解决方案

使用新的JsonSerializable接口提供您自己的供json_encode使用的json表示

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的解决方案

如果您确实希望序列化您的私有和受保护对象属性,则必须在您的类中实现一个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()                
        ));
    }
    ...
}
票数 159
EN

Stack Overflow用户

发布于 2012-05-08 23:02:39

在PHPJSON5.4.0中,有一个用于将对象序列化为>=的新接口:JsonSerializable

只需在对象中实现接口并定义一个在使用json_encode时将被调用的JsonSerializable方法即可。

因此,用于PHPPHP5.4.0的解决方案应该如下所示:

class JsonObject implements JsonSerializable
{
    // properties

    // function called when encoded with json_encode
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}
票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4697656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档