实体具有以下属性:
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;
}
答案 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"
}