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
相关产品推荐
相关产品推荐

