Как выполнить глубокое заполнение, например превратить JSON в объект?Php

Кемеровские программисты php общаются здесь
Anonymous
Как выполнить глубокое заполнение, например превратить JSON в объект?

Сообщение Anonymous »

У меня есть следующий (чрезвычайно упрощенный) пример объекта:

Код: Выделить всё

class Reseller {
private ?Uuid $id;
private string $name;
private ContactInfo $contactInfo;
}
class ContactInfo {
private ?Uuid $id;
private string $defaultEmail;
}

У меня есть JSON, я хочу сериализовать его в существующий $reseller (но то же самое касается и нового):

Код: Выделить всё

{"name":"Changed name","contactInfo":{"defaultEmail":"changed@contact.com"}}
В документации сказано следующее:

Когда для параметра AbstractObjectNormalizer::DEEP_OBJECT_TO_POPULATE установлено значение true, существующие дочерние элементы корневого OBJECT_TO_POPULATE обновляются на основе нормализованных данных вместо того, чтобы денормализатор создавал их заново. Обратите внимание, что DEEP_OBJECT_TO_POPULATE работает только для отдельных дочерних объектов, но не для массивов объектов. Они все равно будут заменены, если они присутствуют в нормализованных данных.

Поэтому я сделал это своим сериализатором:

Код: Выделить всё

return $serializer->deserialize(
$jsonString,
Reseller::class,
'json',
[
AbstractObjectNormalizer::DEEP_OBJECT_TO_POPULATE => true,
AbstractNormalizer::OBJECT_TO_POPULATE => $reseller,
AbstractNormalizer::GROUPS => $groups,
]
);
Однако это приводит к

App\Entity\Reseller::setContactInfo(): Аргумент №1 ( $contactInfo) должен иметь тип App\Entity\ContactInfo, заданный массив, вызываемый в [...]vendor/symfony/property-access/PropertyAccessor.php в строке 509
Что мне здесь не хватает? Я пробовал разные места и комбинации, но безрезультатно. И поиск в Google просто дает бесконечные примеры того, как сериализовать простые объекты без дочерних элементов.

Остальная часть моей конфигурации сериализатора - это в значительной степени версия документации + обработчик циклических ссылок< /em>

Подробнее здесь: https://stackoverflow.com/questions/782 ... nto-entity

Вернуться в «Php»