Symfony2(反序列化):使用json

时间:2016-08-03 08:46:15

标签: php json symfony serializer

我在Symfony中运行了序列化程序,我可以使用EntityController GET和POST json。我有一个编辑表单,可以编辑和保存现有的对象/实体。当编辑的对象被发布(作为json对象)时,json对象被反序列化,持久化并刷新到数据库中。到目前为止一直很好,至少只要我不发布关联(ManyToMany)实体。

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

  1. 对象

  2. 元素

  3. 这有效(另见控制器中的jsonEditAction(下面发布)):

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

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

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

    当我发布上述json时,我从Symfony收到以下通知:

      

    " message":"类型为\" AppBundle \ Entity \ Element \",\"整数\"的预期参数给定&#34 ;,                       " 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
        }]
    }
    

    更新: 我的问题是: Deserialize an entity with a relationship with Symfony Serializer Component 创建了一个拉取请求,并将在Symfony 3.2 ...

    中合并

1 个答案:

答案 0 :(得分:0)

你有一个糟糕的JSON,Symfony说你也一样。

好的JSON可以是这样的:

{
    "id": "1",
    "name": "object 1",
    "elements": [
        {"id": "254", "name": "element 254"},
        {"id": "301", "name": "element 301"}
    ]
}

Symfony尝试从原始JSON中的Element"1"反序列化"2"对象并失败。