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

JMSSerializer, serialize Entity values to (key, value) pair in json object

给定的实体具有以下属性:

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 对象中的键值对。

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

编辑

翻译实体与语言实体存在多对一关系:

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

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

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

您可以使用自定义实施方式存档您的 objective,如下所示:

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);
   }    

希望对您有所帮助

我的错误,我认为我不需要提及此实体与另一个实体之间存在 ManyToOne 关系。但是@Matteo 指出了正确的方向。通过对他的代码进行少量配置,我设法使它正常工作。

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

加入Languages.php:

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

在控制器中:

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

输出:

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