将PHP对象转换为JSON格式

4

Consider this stripdown class:

class foo {

    private $fooVar;


    public getFooVar(){

    }

}


$fooObj = new foo();

我需要做的是将此转换为JSON格式,因此我考虑使用以下方法:
echo json_encode($fooObj);

然而,它并不起作用。我没有fooVar,我猜测是因为$fooVar是私有的...

还有其他方法可以实现这一点,而无需妥协并使$fooVar变成公共的吗?

非常感谢!


你使用的是哪个版本的PHP?后续的PHP版本中可能有一些功能可以帮助你。 - Spudley
1
你是否考虑为该类添加一个方法,以便你可以执行以下操作: echo $fooObj->getJson(); - Artem Goutsoul
谢谢大家的回答,我将实现jsonserializable接口!干杯! - Keith A
3个回答

4
如果您使用的是PHP 5.3(或更早版本),那么很难做到您想要的。JSON是一种数据格式,不包括函数,因此您无法在其中获取编码方法,并且您也无法获取私有属性。您已经知道了这些,但值得再次强调的是,确实很困难。即使将访问器写为一个魔术方法__get(),以便将其转换为只读的公共属性,在这种情况下也行不通。
在PHP 5.3中,有几种解决方法可供选择。
- 反射。PHP包含反射API,允许您访问有关对象和类的详细信息,包括从私有成员读取值。然而,显然,这意味着编写相当多的代码来获取该值,并且速度也不会很快。 - 在类内部编写json_encode调用。这样,您就可以包括私有属性。我建议在对象内部使用get_object_vars($this)以一种JSON友好的方式获取私有属性。
如果您使用的是PHP 5.4,则有另一个选项:
- PHP 5.4引入了一个JsonSerializable 接口。将implements JsonSerializable添加到您的类中,并编写一个名为jsonSerialize()的方法。此方法应返回您希望在JSON字符串中出现的数据。您可以包括或排除任何您想要的公共或私有属性。
PHP 5.5尚未发布,但它将为您添加另一个选项:
- PHP 5.5将引入更复杂的语法来定义属性,这将允许您将属性定义为只读的公共属性,或者在getter和setter中包含更复杂的逻辑,但仍将其作为属性存在。它将像__get()__set()方法一样工作,但变量明确定义为属性,这意味着它们应该可以被JSON解析器访问,而当前使用__get()时它们不能。
希望这可以帮助到您。

1

使用自定义类型进行JSON解码有些棘手,因为JSON中没有关于类型的信息。你只有通用对象(哈希表)和数组。

但是要将对象序列化为JSON,可以实现JsonSerializable接口。然后json_encode函数将执行你想要的操作。


0

这将打印一个包含类foo的所有属性(公共、私有和受保护)的JSON:

$reflection = new ReflectionClass('foo');
$properties = $reflection->getdefaultProperties();

echo json_encode($properties);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接