【问题标题】:How to solve exception NotNormalizableValueException during deserialization array of objects in Serializer Component?如何解决序列化程序组件中对象反序列化数组期间出现的异常 NotNormalizableValueException?
【发布时间】:2020-04-26 10:47:28
【问题描述】:

对象反序列化时出现如下错误:

Symfony\Component\Serializer\Exception\NotNormalizableValueException

类“shop\manage\flexbe\objects\Lead”的“products”属性类型必须是“shop\manage\flexbe\objects\Product[]”之一(给定“array”)。

有 JSON 对象:

{
  "id": "9757241",
  "time": "1567105530",
  // other params
  "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() 方法的反序列化器应该绕过数组并将所有对象添加到 Product 类中,例如 in this case

【问题讨论】:

    标签: symfony


    【解决方案1】:

    我决定使用一个 ArrayDenormalizer,一个带有 PHPDoc 的 setter 来指示数据类型,一个 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 类产品的 Setter:

    /**
    * @param Product[] $products
    */
    public function setProducts(array $products)
    {
    $this->products = $products;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      相关资源
      最近更新 更多