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"
}
给定的实体具有以下属性:
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"
}