@MarkLb

Как решить ошибку при десерелиазиации объекта с массивом?

Возникает следующая ошибка при десерализации объекта:

Symfony\Component\Serializer\Exception\NotNormalizableValueException
The type of the "products" attribute for class "shop\manage\flexbe\objects\Lead" must be one of "shop\manage\flexbe\objects\Product[]" ("array" given).


Есть JSON-объект, проблема связанна с "products":
{
	"id": "9757241",
	"time": "1567105530",
	// другие параметры
	"products": [
	  {
		"title": "Product name",
		"count": 1
	  }
	]
}


В классе Lead, который описывает объект, связанные методы:
private $products = [];

    /**
     * @return Product[]
     */
    public function getProducts()
    {
        return $this->products;
    }

    /**
     * @param Product $product
    */
    public function addProduct(Product $product): void
    {
        $this->products[] = $product;
    }


Код десериализации:
$normalizer = new ObjectNormalizer(null, null, new PropertyAccessor(), new ReflectionExtractor());
$serializer = new Serializer(array($normalizer), array(new JsonEncoder()));
$lead =  $serializer->deserialize($data, Lead::class, 'json');


Не могу понять в чём проблема. По-сути, при использовании метода addProduct() в связке с PropertyAccessor-классом десериализатор должен был пройтись по массиву и поместить объекты в нём в класс Product.
  • Вопрос задан
  • 263 просмотра
Пригласить эксперта
Ответы на вопрос 1
@MarkLb Автор вопроса
Решено: с помощью ArrayDenormalizer, и сеттера с PHPDoc с указанием типа данных массив объектов Products[].
Правда, почему не сработал метод с addProduct() — остаётся вопросом.

Десериализация:
$encoder = [new JsonEncoder()];
        $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]);
        $normalizer = [new ArrayDenormalizer(), new ObjectNormalizer(null, null, null, $extractor)];
        $serializer = new Serializer($normalizer, $encoder);
        /** @var $lead Lead  */
        $lead = $serializer->deserialize($data,Lead::class,'json');


Сеттер для продуктов в классе Lead:
/**
     * @param Product[] $products
     */
    public function setProducts(array $products)
    {
        $this->products = $products;
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы