PHP 对象到 JSON 格式

标签 php json

<分区>

考虑这个 stripdown 类:

class foo {

    private $fooVar;


    public getFooVar(){

    }

}


$fooObj = new foo();

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

echo json_encode($fooObj);

但是它不起作用,我没有 fooVar,我猜是因为 $fooVar 是私有(private)的..

我可以通过其他方式做到这一点而不必妥协并公开 $fooVar 吗?

非常感谢!

最佳答案

如果您使用的是 PHP 5.3(或更早版本),您将无法真正轻松地完成您的要求。您不会获得以 JSON 编码的方法,因为 JSON 是一种数据格式并且不包含函数,并且您不会获得该属性,因为它是私有(private)属性。你已经知道这么多了,但值得重申的是,你是对的,这并不容易。在这种情况下,即使将 getter 编写为神奇的 __get() 方法以将其变成只读公共(public)属性也行不通。

在 PHP 5.3 中,您可以使用一些解决方法。

  • 反射。 PHP 包括一个反射 API,它允许您访问有关对象和类的详细信息,包括从私有(private)成员读取值。然而,显然,这将意味着编写相当多的代码来获取值,而且速度也不会很快。

  • 在类中编写json_encode调用。这样你就可以包含私有(private)属性。我建议在对象内部使用 get_object_vars($this) 以 JSON 友好的方式获取私有(private)属性。

如果您使用的是 PHP 5.4,您还有一个额外的选择:

  • PHP 5.4 引入了一个JsonSerializable 接口(interface)。将 implements JsonSerializable 添加到您的类中,并编写一个名为 jsonSerialize() 的方法。此方法应返回您希望在 JSON 字符串中的数据。您可以包括或排除您想要的任何公共(public)或私有(private)属性(property)。

PHP 5.5 尚未发布,但它会为您添加另一个选项:

  • PHP 5.5 将引入更复杂的属性定义语法,这将允许您将属性定义为公共(public)但只读的,或者在 getter 和 setter 中为它们包含更复杂的逻辑,但仍然拥有它们作为属性。它的工作方式与 __get()__set() 方法现在的工作方式非常相似,但变量明确定义为属性,这意味着它们应该可供JSON 序列化器,而目前使用 __get() 它们不是。
    [EDIT] - 注意,上面的段落是不正确的;所描述的特性并没有出现在 PHP 5.5 版本中。现在说它是否会进入 5.6 还为时过早。

希望对您有所帮助。

关于PHP 对象到 JSON 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796596/

相关文章:

javascript - form.submit 方法在 jQuery 中不起作用

javascript - 按类别对 JSON 内容进行排序

c# - ServiceStack.OrmLite : Support for sql native JSON types and indexing?

java - JSONArray 中的唯一 JSONObject

javascript - 使用 JSON 填充 DataTable,需要在一个列中呈现一个超链接,其中包含在不同 JSON 字段中找到的值

php - 动态生成的 Wordpress 所见即所得编辑器 (wp_editor) 无法正确显示

php - 在mysql中生成批号?

php - 表中元素随机顺序的最佳方法

Javascript 对象到数组

php - 在 php 中为 dpd.com 发送 soap 请求