FOSRestBundle& JMSSerializer:错误的Json响应

时间:2014-05-08 16:29:07

标签: php symfony fosrestbundle jmsserializerbundle

在同一个响应中,我得到一个字段作为对象,一个字段作为数组,我该怎么纠正呢?

注意我没有建议我的回复,因为我正在使用 JMSSerializer

enter image description here

enter image description here

代码(编辑1)

\实体\ Profil.php

       class Profil
        {

        ...
        /**
             * Get actualites
             *
             * @return \Doctrine\Common\Collections\Collection 
             */
            public function getActualites()
            {
                return $this->actualites;
            }
...
/**
     * Add actualites
     *
     * @param \Genius\ProfileBundle\Entity\Actualite $actualites
     * @return Profil
     */
    public function addActualite(\Genius\ProfileBundle\Entity\Actualite $actualites)
    {
        $this->actualites[] = $actualites;

        return $this;
    }


    ...
    public function __construct()
        {
...         
         $this->actualites = new \Doctrine\Common\Collections\ArrayCollection();
...
        }

1 个答案:

答案 0 :(得分:3)

JsonResponse使用json_encode对值进行编码。默认情况下,json_encode会将php关联数组转换为json对象,数字索引数组将保留为json数组。有关json_encode如何工作的更多信息,请参阅PHP docs

我的建议是以你想要你的json的方式格式化你的php。如果你只想在你的json中使用数组,那么你应该只使用数字索引数组格式化你的php数据。如果你只想在你的json中使用对象,那么将你的php数据格式化为仅使用关联数组。

示例:

$a = array(1,2,3);
echo json_encode($a); // [1,2,3] array output in json

$b = array('a'=>1, 'b'=>2, 'c'=>3);
echo json_encode($b); // {a:1,b:2,c:3} object output in json

看起来你正在使用一个ArrayCollection,它在技术上是一个对象。如果要将ArrayCollection转换为简单数组,Doctrine docs会显示您可以调用toArray()方法。所以你会做这样的事情:

$arrayValue = $object->getActualites()->toArray();

您可以尝试其他一些事情,但它们可能会产生不必要的副作用。

解决方案1: 你可以在你的实体中尝试这个:

public function getActualites()
{
    return $this->actualites->toArray();
}

这样,每当调用此方法时,它将返回一个数组而不是数组集合。这个解决方案比下一个好。

解决方案2: 另一种选择是使该变量本身成为一个数组。所以在构造函数中,你会有这个

public function __construct()
{       
     $this->actualites = array();
}

我还没有测试过这个解决方案,我不是百分百确定Doctrine 是否需要 Array Collection,但你可以尝试作为最后的手段。