JMSSerializerBundle如何实现整数到字符串的自定义序列化映射
方案1:使用@JMS\Accessor/@JMS\VirtualProperty注解(单字段场景首选,实现最简单)
如果仅需要对这一个字段做映射转换,直接通过注解自定义序列化取值逻辑即可:
直接替换原有字段输出
修改字段注解,指定序列化时调用自定义getter完成映射:
/** * @ORM\Column(type="integer") * @JMS\Expose * @JMS\Accessor(getter="getTypeAsString") */ private int $type; // 新增自定义getter方法 public function getTypeAsString(): string { // PHP 8+ 可以用match语法 return match($this->type) { 0 => 'OK', 1 => 'FAIL', default => 'UNKNOWN' }; // PHP 7及以下版本用数组映射 // $map = [0 => 'OK', 1 => 'FAIL']; // return $map[$this->type] ?? 'UNKNOWN'; }
保留原有整数字段,新增映射字符串输出
如果需要同时输出原数字值和映射后的字符串,用虚拟字段注解实现即可,不需要修改原有字段配置:
// 原有字段保持不变 /** * @ORM\Column(type="integer") * @JMS\Expose */ private int $type; /** * @JMS\VirtualProperty * @JMS\SerializedName("type_label") // 自定义序列化输出的字段名 */ public function getTypeLabel(): string { $map = [0 => 'OK', 1 => 'FAIL']; return $map[$this->type] ?? 'UNKNOWN'; }
方案2:自定义序列化处理器(多字段复用场景首选)
如果项目中多个字段都需要用到0/1转OK/FAIL的映射逻辑,可以自定义全局序列化处理器,避免重复写映射代码:
- 先创建处理器类:
<?php namespace App\Serializer\Handler; use JMS\Serializer\GraphNavigatorInterface; use JMS\Serializer\Handler\SubscribingHandlerInterface; use JMS\Serializer\Context; class StatusTypeHandler implements SubscribingHandlerInterface { public static function getSubscribingMethods() { return [ [ 'direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION, 'format' => 'json', 'type' => 'status_string', 'method' => 'convertToStatusString', ], ]; } public function convertToStatusString($visitor, int $value, array $type, Context $context) { $map = [0 => 'OK', 1 => 'FAIL']; return $map[$value] ?? 'UNKNOWN'; } }
- 注册处理器(以Symfony框架为例,其他框架参考对应JMS集成文档):
# config/services.yaml services: App\Serializer\Handler\StatusTypeHandler: tags: - { name: jms_serializer.subscribing_handler }
- 在需要转换的字段上指定类型即可:
/** * @ORM\Column(type="integer") * @JMS\Expose * @JMS\Type("status_string") */ private int $type;
内容的提问来源于stack exchange,提问作者nforced
相关产品推荐
相关产品推荐

