Десериализовать json в сущность с вложенным объектом DateTime в Symfony 4 - PullRequest
0 голосов
/ 28 марта 2019

У меня есть объект, который содержит поле типа DateTimeInterface с именем completedAt, и я хочу десериализовать объект JSON для этого объекта объекта.

Я пытался DateTimeNormalizer и ObjectNormalizer, но они оба дали мне ошибку, сказав, что я не могу присвоить строку / массив объекту DateTime.

Например, у меня есть эта сущность,

class Task
{
    private $id;
    private $name;

    /**
     * @var DateTimeInterface
     */
    private $completedAt;
}

и способ создания объекта JSON в моем тесте с использованием PHPUnit,

$rawData = json_encode([
    'name' => 'test-task',
    'completedAt' => Carbon::now()->toRfc3339String(),
    // I tried some other formats here, such as datetime array, datetime string, etc.
]);

В моем контроллере я попробовал это (это тест, а не мой реальный код):

public function update(Request $request, Task $task, SerializerInterface $serializer): Response
{
    $task = new Task();
    $task->setName('test');
    $task->setCompletedAt(Carbon::now()->toDateTime());

    $json = $serializer->serialize($task, 'json');

    $serializer = new Serializer([new ObjectNormalizer(), new DateTimeNormalizer()], [new JsonEncoder()]); // array of needed normalizer
    var_dump($serializer->deserialize($json, Task::class, 'json'));
}

Я получил эту ошибку,

NotNormalizableValueException Ожидаемый аргумент типа «DateTimeInterface», «строка», заданный в пути к свойству «completeAt».

Как можно десериализовать этот объект JSON с помощью нескольких нормализаторов?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Если вы хотите, чтобы ваши данные json были преобразованы в создаваемую вами сущность, и вы используете symfony serialzer

$serializer = new Serializer([new ObjectNormalizer()]); // array of needed normalizer
$serializer->denormalise($json_data,YourEntity::class);

должно работать просто отлично

https://symfony.com/doc/current/components/serializer.html

0 голосов
/ 01 апреля 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...