Symfony SerializerInterface десериализовать json в класс не работает

Вот мой код контроллера для получения запроса POST с телом JSON, который затем я хотел бы десериализовать в свой dto. Звучит просто, но по какой-то причине не работает так, как ожидалось. Одним из свойств является массив объектов, и при десериализации он десериализуется в массив массивов.

Контроллер:

<?php

namespace App\Controller;

use Symfony\Component\Serializer\SerializerInterface;
use App\Dto\CreateDto;

class EntryController extends AbstractController
{
    public function __construct(SerializerInterface $serializer)
    {
        $this->serializer = $serializer;
    }

    /**
     * @Route("", methods={"POST"})
     *
     */
    public function createEntry(Request $request)
    {
        $content = $request->getContent();

        $entry = $this->serializer->deserialize($content, CreateDto::class, 'json');

        ...
    }
}

ДТО:

<?php

namespace App\Dto;


class CreateDto
{
    public $name;
    public $email;
    public $items; // this is CreateDto[]
}

Я делаю запрос, используя POST-запрос почтальона с типом содержимого тела json.

 {
        "name": "Example",
        "email": "example@example",
        "items": [
               {
                  "name": "sub",
                  "email": "[email protected]"
               }
         ]
    }

Симфони версии 5.0.8


person StackNet    schedule 08.05.2020    source источник


Ответы (1)


Вам нужно объявить, какие поля являются сериализованными или десерилиазными.

<?php

namespace App\Dto;

use Symfony\Component\Serializer\Annotation\Groups;


class CreateDto
{
    /**
     * @Groups({"api""})
     */
    public $name;
    /**
     * @Groups({"api""})
     */
    public $email;
    /**
     * @Groups({"api""})
     */
    public $items; // this is CreateDto[]
}

После того

 $entry = $this->serializer->deserialize($content, CreateDto::class, 'json', ["groups" => "api"]);

Дайте сериализатор тем группам, которые нужно сериализовать или десериализовать. Как это.

person Fatih Kahveci    schedule 09.05.2020
comment
Привет, в моем случае свойства десериализованы, но элементы свойств в десериализованном объекте не являются массивом объектов, как я ожидал, а массивом массивов, в котором каждый объект элемента является массивом - person StackNet; 09.05.2020
comment
@StackNet, тогда вам нужно указать тип $items. symfony.com/doc/current/components/ посмотри на это. - person Fatih Kahveci; 09.05.2020
comment
Вы имеете в виду добавление /** * @var self[] */ к свойству $items? потому что я попробовал это, но та же проблема. Все еще десериализуем в массив массивов - person StackNet; 09.05.2020
comment
Я не совсем уверен, но добавление @var self[] или, возможно, @var CreateDto[] должно решить вашу проблему. Но проблема в типе $items. Вам нужно сообщить сериализатору, что свойство $items имеет тип CreateDto, тогда сериализатор десериализует его в объект CreateDto вместо массива. - person Fatih Kahveci; 09.05.2020
comment
Боюсь, что нет. все еще отладчик говорит, что его массив - person StackNet; 09.05.2020