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

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的映射逻辑,可以自定义全局序列化处理器,避免重复写映射代码:

  1. 先创建处理器类:
<?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';
    }
}
  1. 注册处理器(以Symfony框架为例,其他框架参考对应JMS集成文档):
# config/services.yaml
services:
    App\Serializer\Handler\StatusTypeHandler:
        tags:
            - { name: jms_serializer.subscribing_handler }
  1. 在需要转换的字段上指定类型即可:
/**
 * @ORM\Column(type="integer")
 * @JMS\Expose
 * @JMS\Type("status_string")
 */
private int $type;

内容的提问来源于stack exchange,提问作者nforced

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:27:03