JMSSerializer,将实体值序列化为json对象中的(key,value)对

时间:2016-10-13 09:28:02

标签: json symfony doctrine-orm jmsserializerbundle

实体具有以下属性:

class Translation
{
  /**
   * @var string
   * @SerializedName("language_code")
   */
  private $lang;

  /**
   * @var string
   * @SerializedName("text")
   */
  private $translation;

  /**
   * @var int
   */
  private $language_id;
}

控制器如下所示:

class DefaultController extends {
    public function indexAction(Request $request) {
        $translation = $this->getDoctrine()->getRepository('AppBundle:Translation')->findAll();
        $serializer = SerializerBuilder::create()->build();
        $translationJson = $serializer->serialize($translation, 'json');

        return new Response($translationJson);
   }    
}

我的前端需要这样的json格式:

 {
  "en" : "yes",
  "de" : "ja",
  "it" : "si"  
 }

我的项目要复杂得多,但这是对问题的简要描述。我唯一关心的是如何将属性格式化为json对象中的键值对。

我可以使用注释来实现吗? 如果没有,那怎么样?

修改

翻译实体与语言实体具有ManyToOne关系:

class Languages
{
  /**
   * @var int
   */
  private $id;

  /**
   * @var int
   * @ORM\OneToMany(targetEntity="Translation", mappedBy="translation_id", cascade={"persist"}, orphanRemoval=true)
   */
  private $translations;
}

2 个答案:

答案 0 :(得分:1)

您的要求在标准库中实现并不是那么标准:您希望将对象集合转换为单个对象并将其列为具有值的属性(作为Json转置数据)。

您可以使用自定义实现归档目标,如下所示:

public function indexAction(Request $request) {
        $translation = $this->getDoctrine()->getRepository('AppBundle:Translation')->findAll();

        $obj = new \StdClass;

        foreach ($translation as $elem)
        {
            // transform each value in an attribute/value of the single object 
            $obj->{$elem->getLang()} = $elem->getTranslation();
        }

        return new JsonResponse($obj);
   }    

希望这个帮助

答案 1 :(得分:1)

我的错误,我想我不需要提到这个实体与另一个实体有很多关系。但@Matteo指出了正确的方向。通过他的代码的一个小配置,我设法让这个工作。

使用以下$obj = new \StdClass;中的对象getWhateva()根本不起作用。我没有在控制器中尝试过它。配置如下:

添加语言.php:

/**
 * @VirtualProperty
 * @SerializedName("whateva")
 */
public function getWhateva() {
    $arr = array();
    foreach ($this-> translation as $elem) {
        $arr[$elem-> getLang()] = $elem->getTranslation();
    }
    return $arr;
}

并在Controller中:

    $langu = $this->getDoctrine()->getRepository('AppBundle:Language')->findAll();
    $languageJson = $serializer->serialize($language, 'json');

输出:

"whateva": {
       "en" : "yes",
       "de" : "ja",
       "it" : "si"  
 }