繁体   English   中英

Symfony2(反序列化):使用JSON更新实体(具有关联)

[英]Symfony2 (deserialize): update entity (with association) with json

我在Symfony中使序列化器正常工作,我可以使用EntityController进行GET和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 \\“的预期参数,\\”给定的整数\\“,” 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM