【问题标题】:Symfony2 (deserialize): update entity (with association) with jsonSymfony2(反序列化):使用 json 更新实体(有关联)
【发布时间】:2016-08-03 08:46:14
【问题描述】:

我让 Symfony 中的序列化程序正常工作,我可以使用 EntityController 获取和发布 json。我有一个编辑表单,可以在其中编辑和保存现有对象/实体。当编辑的对象被发布(作为 json 对象)时,json 对象被反序列化、持久化并刷新到数据库中。到目前为止一切顺利,至少只要我不发布关联的 (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\" given", "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 中合并...

【问题讨论】:

  • 可能你正在寻找 Symfony Data transformer
  • 但只要涉及到序列化程序,它应该隐式处理转换器,我使用JMSSerializerFOSRestBundle。但我从来没有遇到过这样的问题。那是因为,即使数据是以干净的 JSON 格式提交的,我也总是使用表单类型来处理发布数据。
  • @Jeet:你能给我看一个你的处理程序的例子吗?
  • 没有这样的处理程序,FOSRestBundle 通过提供要覆盖的事件来处理它。我建议使用form type 来捕获实体关联相关数据。该表单会自动为您转换数据。

标签: php json symfony serialization


【解决方案1】:

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

一个好的 JSON 可以是这样的:

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

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

【讨论】:

  • 嗨,Alexey,我发布了一个类似上面的 json,但我仍然得到同样的错误
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多