PHP对象到JSON格式

时间:2013-02-10 10:05:27

标签: php json

考虑这个脱衣舞课程:

class foo {

    private $fooVar;


    public getFooVar(){

    }

}


$fooObj = new foo();

我希望/需要做的是将其转换为JSON格式,所以我想放

echo json_encode($fooObj);

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

我可以做任何其他方式而不必妥协并将$ fooVar公开?

非常感谢!

3 个答案:

答案 0 :(得分:3)

如果您使用的是PHP 5.3(或更早版本),则无法轻松完成您的要求。你不会得到用JSON编码的方法,因为JSON是一种数据格式,不包含函数,你不会得到属性,因为它是一个私有属性。你已经知道了这一点,但值得重新指出你是对的,这并不容易。在这种情况下,即使将getter作为一种神奇的__get()方法将其转换为只读公共属性也不行。

在PHP 5.3中,您可以使用几种解决方法。

  • Reflection。 PHP包含一个Reflection 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序列化程序访问,而目前使用{{1}他们不是。
    [编辑] - 请注意,上述段落不正确;所描述的功能没有进入PHP 5.5版本。尚未说明它是否会进入5.6。

希望有所帮助。

答案 1 :(得分:1)

JSON解码对于自定义类型有点棘手,因为您没有关于JSON类型的信息。你所拥有的只是通用对象(哈希表)和数组。

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

答案 2 :(得分:0)

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

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

echo json_encode($properties);