Как решить исключение NotNormalizableValueException при десериализации массива объектов в Serializer Component? - PullRequest
0 голосов
/ 26 апреля 2020

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

Symfony \ Component \ Serializer \ Exception \ NotNormalizableValueException

Тип атрибута "products" для класс "shop \ manage \ flexbe \ objects \ Lead" должен быть одним из "shop \ manage \ flexbe \ objects \ Product []" (задан "массив").

Иметь JSON - object:

{
  "id": "9757241",
  "time": "1567105530",
  // other params
  "products": [
    {
    "title": "Product name",
    "count": 1
    }
  ]
}

В классе Lead, который описывает методы, связанные с объектом, для "products":

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 () должно обойти массив и добавить все объекты в класс Product, например , в данном случае .

1 Ответ

0 голосов
/ 26 апреля 2020

Я решил использовать ArrayDenormalizer и сеттер с PHPDo c, указывающим тип данных, массив объектов 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...