【问题标题】:Asymmetric serialization/deserialization using Symfony Serilizer使用 Symfony Serializer 的非对称序列化/反序列化
【发布时间】:2022-01-12 16:46:30
【问题描述】:

我正在使用 Symfony 5.4 及其 Symfony/Serializer 组件。

我收到如下 JSON 负载:

{
  "name": "Truck",
  "age": 23
}

我希望我可以将其反序列化为以下模型,其中 name JSON 字段将映射到 lastname User 类属性:

class User {
  protected lastname;
  protected age;
}

我的问题是反序列化失败,因为我的模型中没有 name 字段。

当然,我可以在我的 User 模型中添加一个 name 字段,并将其 getter/setter 编写如下,并使用 Serializer 的组不序列化 name 字段:

public function getName(): string
{
    return $this->lastname;
}

public function setName(string $name): User
{
    $this->lastname = $name;

    return $this;
}

但这看起来很老套。无论如何,除了上述之外,我还需要将任何User 实体序列化为:

{
  "lastname": "Truck",
  "age": 23
}

因此,我不能在这里使用@SerializedName('name')

实现这一目标的更简洁的方法是什么?

【问题讨论】:

    标签: php symfony serialization deserialization


    【解决方案1】:

    您可以实现AdvancedNameConverterInterface

    一个非常简单、幼稚的实现:

    <?php declare(strict_types=1);
    
    use Symfony\Component\Serializer\NameConverter\AdvancedNameConverterInterface;
    
    class UserNameConverter implements AdvancedNameConverterInterface
    {
    
        public function denormalize(string $propertyName, string $class = null, string $format = null, array $context = [])
        {
            if ($class === User::class && $propertyName === 'lastname') {
                return 'name';
            }
    
            return $propertyName;
        }
    
        public function normalize(string $propertyName, string $class = null, string $format = null, array $context = []): string
        {
            return $propertyName;
        }
    }
    

    查看文档here

    enable it in the configuration,你应该可以做到:

    framework:
        # ...
        serializer:
            name_converter: 'App\YourNamespace\UserNameConverter'
    

    【讨论】:

    • 感谢您的回复。不幸的是,我已经在我的 ObjectNormalizer 上设置了 MetadataAwareNameConverter,所以我不确定如何从注释和 UserNameConverter 中受益。有可能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多