2013-02-10 66 views
3

考虑这个stripdown类:PHP对象为JSON格式

class foo { 

    private $fooVar; 


    public getFooVar(){ 

    } 

} 


$fooObj = new foo(); 

想我想/需要做的就是它转换为JSON格式,所以我想过把

echo json_encode($fooObj); 

但它不工作的,我没有fooVar和即时猜测,因为$ fooVar是私人的。

任何其他方式我可以做到这一点,而不必妥协,并使$ fooVar公共?

非常感谢!

+0

您使用的是哪个版本的PHP?后来的PHP版本中有一些功能可以帮助您。 – Spudley 2013-02-10 10:18:14

+1

您是否考虑过在类中添加一个方法,以便您可以按照以下方式做一些事情: 'echo $ fooObj-> getJson();' – 2013-02-10 10:30:37

+0

感谢所有答案,我只是要实现jsonserializable接口!干杯! – 2013-02-10 15:39:36

回答

3

如果你使用PHP 5.3(或更早),你不能真正做到你很容易要求什么。由于JSON是一种数据格式,不包含函数,因此您将无法获得JSON编码的方法,并且您不会获取该属性,因为它是私有属性。你已经知道了这一点,但值得重新指出你是对的,这并不容易。即使将吸气剂写成魔术__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序列化程序访问,而当前它们不是 __get()
    [编辑] - 注意,上述段落不正确;所描述的功能并没有进入PHP 5.5版本。尚不清楚是否会进入5.6。

希望有帮助。

0

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

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

echo json_encode($properties); 
1

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

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