【问题标题】:Symfony 2 / Php : json_encodeSymfony 2 / PHP:json_encode
【发布时间】:2011-12-05 14:53:36
【问题描述】:

我一直在寻找解决问题的方法,但没有成功,所以我在这里问。

我们如何在包含私有属性的对象数组(或只是一个对象)上返回一个 json 编码的结果?

确实,当您使用 json_encode($myObject) 时,它不会显示私有或受保护的属性,而这些属性在使用 Symfony 时在模型中无处不在......

我很惊讶我找不到像 json_encode 这样会调用 getter 而不是属性本身的方法。

有什么想法吗?

编辑

在这种情况下,我宁愿做一个看起来像这样的独特功能:

public function toArray() {
    $vars = get_object_vars($this);
    $result = array();
    foreach ($vars as $key => $value) {
        if (is_object($value)) {
            $result[$key] = toArray($value);
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}

为了避免每次都重写每个属性名...

但无论如何我想我会创建一个包含我需要的变量的数组,这样我就不会接触模型(这是生成的代码)。

【问题讨论】:

  • 请使用标题字段描述您的问题

标签: php ajax json symfony


【解决方案1】:
【解决方案2】:

目前没有办法做到这一点。只有 php serialize/unserialize 处理对象的真正序列化。

您必须自己实现它们,或者让对象自己返回它们的 json 值。

您必须实现自己的 toArray() 方法,将所有私有值暴露在一个数组中:

public function toArray()
{
  return array(
      'property1' => $this->myproperty1,
      'property2' => $this->myproperty2
  );
}

然后这样称呼它:

json_encode(MyObject->toArray());

[编辑:这个问题与教义无关,但由于您提到了 symfony2 和模型,您可以考虑为您的模型使用 Array Hydration:http://www.doctrine-project.org/docs/orm/2.0/en/reference/dql-doctrine-query-language.html#array-hydration]

【讨论】:

  • 在尝试调用它时收到一条消息“调用未定义的方法 toArray”。
  • 抱歉,说明中添加了一点
  • 哎呀,好吧,当你必须为每个模型(有很多属性)都这样做时不是很方便......
  • 是的,没错,但这是 PHP 的限制。如果只需要通过json发送,看我贴的数组水合。这是通用的 PHP 解决方案。对于教义,可能有更好的解决方案。
  • PHP 5.4 将在使用 json_encode() 时支持对象中的 toJSON() 方法。 Zend 框架的 Zend_Json::encode() 方法支持对象的 toJson() 方法,但仅限于一级深度。因此不支持嵌套对象结构,因此您无法序列化对象数组。
猜你喜欢
  • 2023-04-07
  • 2012-01-17
  • 2015-03-14
  • 2015-02-08
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多