Symfony2(反序列化):用json更新实体(带关联)


Symfony2 (deserialize): update entity (with association) with json

我让Symfony中的序列化程序正常工作,我可以用EntityController获取和POST json。我有一个编辑表单,可以在其中编辑和保存现有的对象/实体。当编辑后的对象被发布(作为json对象)时,json对象被反序列化、持久化并刷新到数据库中。到目前为止还不错,至少只要我不发布关联的(ManyToMany)实体。

我有两个实体(具有ManyToMany关联):

  1. 对象

  2. 元素

这是有效的(另请参阅控制器中的jsonEditAction(发布在下面)):

{
    "id": "1",
    "name": "object 1"
}

我的问题是:如何在json中编辑带有关联实体的对象,如下所示:

{
    "id": "1",
    "name": "object 1",
    "elements": {
        "0": "1",
        "1": "2"
    }
}

当我发布上面的json时,我收到了来自Symfony的以下通知:

"message":"预期参数类型为''"AppBundle''Entity''Element''",''"integer''"给定","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对象,但失败了。