
[英]symfony2 JMSSerializerBundle deserialize entity with OneToMany association
[英]Symfony2 (deserialize): update entity (with association) with json
我在Symfony中使序列化器正常工作,我可以使用EntityController进行GET和POST json。 我有一个编辑表单,可以在其中编辑和保存现有的对象/实体。 当发布编辑后的对象(作为json对象)时,json对象将反序列化,保留并刷新到数据库中。 到目前为止,至少只要我不发布关联的(ManyToMany)实体,它就很好。
我有两个实体(具有ManyToMany关联):
宾语
元件
这可以正常工作(另请参阅控制器中的jsonEditAction(如下所述)):
{
"id": "1",
"name": "object 1"
}
我的问题是:如何编辑带有json中关联实体的对象,如下所示:
{
"id": "1",
"name": "object 1",
"elements": {
"0": "1",
"1": "2"
}
}
当我发布上述json时,我从Symfony获得以下通知:
“ message”:“类型为\\” AppBundle \\ Entity \\ Element \\“的预期参数,\\”给定的整数\\“,” class“:” Symfony \\ Component \\ PropertyAccess \\ Exception \\ InvalidArgumentException“,
了解更多信息; 这是将Json发布到的editAction:
public function jsonEditAction(Request $request, $id) {
$serializer = $this->initSerializer();
$em = $this->getDoctrine()->getManager();
$object = $em->getRepository('AppBundle:Object')->findOneById($id);
$data = $request->getContent();
$serializer->deserialize($data, 'AppBundle\Entity\Object', 'json', array('object_to_populate' => $object));
try {
$em->persist($object);
$em->flush();
$view = $this->view($object, 200)
->setTemplate("object/json.html.twig");
} catch (Exception $e) {
$view = $this->view('Caught exception: ' . $e->getMessage() . "\n", 500)
->setTemplate("object/json.html.twig");
}
return $this->handleView($view);
}
private function initSerializer() {
$encoders = array(new JsonEncoder());
$normalizers = array(new ObjectNormalizer());
$serializer = new Serializer($normalizers, $encoders);
return $serializer;
} `
我应该走到带有元素的数组并一一找到它们,然后将其添加到“对象”实体中吗? 还是我错过/看不到的序列化器中的“内置”解决方案?
更新 :同样,Alexey建议的JSON无法正常工作:
{
"id": 2,
"name": "Object 2c",
"elements": [{
"id": 1
}, {
"id": 2
}]
}
更新 :我的问题是重复的: 反序列化与Symfony序列化器组件有关系的实体有一个拉取请求已创建,并将在Symfony 3.2中合并...
您的JSON错误,Symfony也这么说。
好的JSON可能如下所示:
{
"id": "1",
"name": "object 1",
"elements": [
{"id": "254", "name": "element 254"},
{"id": "301", "name": "element 301"}
]
}
Symfony尝试从原始JSON中的"1"
和"2"
反序列化Element
对象,但失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.