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

Symfony序列化组件:addressLine1属性无法转为address_line_1格式

解决Symfony Serializer中addressLine1转成address_line_1的问题

问题根源在于默认的CamelCaseToSnakeCaseNameConverter仅会在大写字母前添加下划线,不会处理字母与数字之间的分隔。因此addressLine1会被转换为address_line1,而非预期的address_line_1。

以下是两种可行的解决方向:

1. 自定义名称转换器(全局统一处理)

继承默认转换器,重写转换逻辑,在字母与数字之间插入下划线:

use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;

class CustomCamelCaseToSnakeCaseNameConverter extends CamelCaseToSnakeCaseNameConverter
{
    public function normalize(string $propertyName): string
    {
        // 先在字母和数字之间添加下划线
        $processed = preg_replace('/([a-z])([0-9])/i', '$1_$2', $propertyName);
        // 再执行默认的驼峰转下划线逻辑
        return parent::normalize($processed);
    }
}

然后在Serializer配置中替换默认转换器:

$normalizers = [
    new BackedEnumNormalizer(),
    new ArrayDenormalizer(),
    new ObjectNormalizer(
        null,
        new CustomCamelCaseToSnakeCaseNameConverter(), // 使用自定义转换器
        null,
        new ReflectionExtractor()
    ),
];
$encoders = [new JsonEncoder()];

$this->serializer = new Serializer($normalizers, $encoders);

2. 使用SerializedName注解(个别属性处理)

如果仅需处理少数属性,直接在属性上标注目标字段名:

use Symfony\Component\Serializer\Annotation\SerializedName;

final class Address {
    // ...其他属性
    #[SerializedName('address_line_1')]
    private ?string $addressLine1;
    
    #[SerializedName('address_line_2')]
    private ?string $addressLine2;
}

这种方式无需修改转换器配置,直接指定属性对应的序列化字段名。

内容的提问来源于stack exchange,提问作者Gus de Boer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:45