如何在 Symfony 5 中递归地对数组进行反规范化?

How to denormalize an array recursively in Symfony 5?

我目前正在尝试对一个数组进行反规范化,该数组来自 API 作为 JSON 响应并被 JSON 解码。

问题是,我希望将其非规范化为 class,其中一个属性是另一个 class。

感觉应该可以使用 Symfony 反规范化器完成如此简单的工作,但我总是遇到以下异常:

Failed to denormalize attribute "inner_property" value for class "App\Model\Api\Outer": Expected argument of type "App\Model\Api\Inner", "array" given at property path "inner_property".

我的反规范化代码如下所示:

$this->denormalizer->denormalize($jsonOuter, Outer::class);

在构造函数中注入反规范化器:

public function __construct(DenormalizerInterface $denormalizer) {

我尝试反规范化的数组:

array (
  'inner_property' => 
  array (
    'property' => '12345',
  ),
)

最后,我尝试将两个 class 非规范化为:

class Outer
{
    /** @var InnerProperty */
    private $innerProperty;

    public function getInnerProperty(): InnerProperty
    {
        return $this->innerProperty;
    }

    public function setInnerProperty(InnerProperty $innerProperty): void
    {
        $this->innerProperty = $innerProperty;
    }
}
class InnerProperty
{
    private $property;

    public function getProperty(): string
    {
        return $this->property;
    }

    public function setProperty(string $property): void
    {
        $this->property = $property;
    }
}

经过几个小时的搜索,我终于找到了原因。问题是“inner_property”蛇形案例和 $innerProperty 或 getInnerProperty 驼峰案例的组合。在 Symfony 5 中,骆驼大小写到蛇形大小写转换器默认未启用。

所以我必须通过在 config/packages/framework.yaml:

中添加这个配置来做到这一点
framework:
        serializer:
                name_converter: 'serializer.name_converter.camel_case_to_snake_case'

这里是对 Symfony 文档的引用:https://symfony.com/doc/current/serializer.html#enabling-a-name-converter

或者,我也可以在外部 class 的 属性 中添加一个 SerializedName 注释: https://symfony.com/doc/current/components/serializer.html#configure-name-conversion-using-metadata

PS:我的问题没有被正确提出,因为我没有正确更改属性和class名称。所以我在未来访客的问题中解决了这个问题。