You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:50:46