Symfony如何将JSON反序列化为含Ulid对象数组的Payload类
解决Symfony Serializer反序列化Ulid数组为对象数组的问题
要让ulidList反序列化后成为Ulid对象数组,核心是让Symfony Serializer明确数组内元素的类型,以下是两种可行方案:
方案一:使用Type属性注解(兼容多数Symfony版本)
在ulidList属性上添加#[Type]注解,指定数组元素为Ulid类型:
use Symfony\Component\Uid\Ulid; use Symfony\Component\Serializer\Annotation\Type; final class Payload { /** * @param Ulid[] $ulidList */ public function __construct( public readonly string $id, #[Type('array<Symfony\Component\Uid\Ulid>')] public readonly array $ulidList, ) { } }
若习惯使用DocBlock注解,也可写成:
use Symfony\Component\Uid\Ulid; final class Payload { /** * @param Ulid[] $ulidList * @Type("array<Symfony\Component\Uid\Ulid>") */ public function __construct( public readonly string $id, public readonly array $ulidList, ) { } }
配置注解支持
确保Serializer服务配置启用了注解加载器,在config/services.yaml中添加:
services: Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory: arguments: - '@serializer.mapping.loader.annotation_loader' Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader: arguments: - '@annotation_reader'
方案二:使用PHP 8泛型类型声明(Symfony 6.1+)
若使用Symfony 6.1及以上版本,Serializer支持自动识别PHP 8泛型数组类型,直接修改构造函数的类型声明即可:
use Symfony\Component\Uid\Ulid; final class Payload { public function __construct( public readonly string $id, public readonly array<Ulid> $ulidList, ) { } }
这种方式无需额外注解,Serializer会自动将数组中的字符串转换为Ulid对象。
验证效果
反序列化后,可通过以下代码验证类型是否正确:
$payload = $this->serializer->deserialize($data, Payload::class, 'json'); var_dump($payload->ulidList[0] instanceof Ulid); // 输出 bool(true)
内容的提问来源于stack exchange,提问作者Jazi
相关产品推荐
相关产品推荐

