Symfony2 (десериализация): обновить сущность (с ассоциацией) с помощью json

Я получил сериализатор в Symfony работает, я могу получить и POST JSON с EntityController. У меня есть форма редактирования, где существующий объект / объект может быть отредактирован и сохранен. Когда отредактированный объект публикуется (как объект 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»,

Для дополнительной информации; это действие editAction, где Json размещен:

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;
}   `

Должен ли я перейти к массиву с элементами и найти их один за другим, а затем добавить их к объекту «объект»? Или в сериализаторе есть встроенное решение, которое я пропустил / не увидел?

ОБНОВИТЬ:
Также JSON, подобный предложенному Алексеем, не работал:

{
"id": 2,
"name": "Object 2c",
"elements": [{
"id": 1
}, {
"id": 2
}]
}

ОБНОВИТЬ:
Мой вопрос является дубликатом:
Десериализовать объект, связанный с Symfony Serializer Component
Создан пулл-запрос, который будет объединен в Symfony 3.2 …

0

Решение

У вас плохой JSON, Symfony говорит вам то же самое.

Хороший JSON может выглядеть так:

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

Symfony пытается десериализовать Element объект из "1" а также "2" в вашем оригинальном JSON и не удается.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]