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

如何在Java中自定义序列化带注解的数据类为指定格式JSON?

自定义Java对象到指定JSON格式的序列化方案

问题背景

给定如下Java类:

@Data // lombok
public class MyData {
    @Required // 自定义注解
    String testValue1;
    Integer testValue2;
}

已完成实例化:

MyData myData = new MyData();
myData.setTestValue1("test1");
myData.setTestValue2(123);

需要将该实例序列化为包含字段元数据的JSON格式,每个字段需体现类型、是否必填(依据@Required注解)和字段值,目标JSON格式如下:

{
    "testValue1": {
        "type": "String",
        "isRequired": "true",
        "value": "test1"
    },
    "testValue2": {
        "type": "Integer",
        "isRequired": "false",
        "value": "123"
    }
}

实现方案:使用Jackson自定义序列化器

Jackson是Java生态中常用的JSON处理库,通过自定义序列化器可以完全控制JSON的生成格式,具体步骤如下:

1. 定义字段元数据DTO

先创建一个类来封装每个字段的元数据信息:

@Data
public class FieldMeta {
    private String type;
    private String isRequired;
    private Object value;
}

2. 编写自定义序列化器

为MyData类实现StdSerializer,通过反射获取字段信息并构建目标JSON结构:

public class MyDataSerializer extends StdSerializer<MyData> {

    protected MyDataSerializer() {
        super(MyData.class);
    }

    @Override
    public void serialize(MyData targetObj, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        
        // 遍历类的所有字段
        Field[] fields = MyData.class.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            FieldMeta meta = new FieldMeta();
            
            // 设置字段类型名称
            meta.setType(field.getType().getSimpleName());
            // 判断是否带有@Required注解
            meta.setIsRequired(String.valueOf(field.isAnnotationPresent(Required.class)));
            // 获取并设置字段值
            try {
                meta.setValue(field.get(targetObj));
            } catch (IllegalAccessException e) {
                throw new RuntimeException("获取字段值失败", e);
            }
            
            // 写入JSON节点:字段名为键,元数据为值
            gen.writeObjectField(field.getName(), meta);
        }
        
        gen.writeEndObject();
    }
}

3. 注册序列化器并执行序列化

在主逻辑中注册自定义序列化器,完成对象到JSON的转换:

public class SerializationDemo {
    public static void main(String[] args) throws JsonProcessingException {
        // 初始化实例
        MyData myData = new MyData();
        myData.setTestValue1("test1");
        myData.setTestValue2(123);
        
        // 配置ObjectMapper并注册序列化器
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(MyData.class, new MyDataSerializer());
        mapper.registerModule(module);
        
        // 序列化并输出格式化后的JSON
        String jsonResult = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myData);
        System.out.println(jsonResult);
    }
}

依赖说明

确保项目中引入Jackson核心依赖(Maven示例):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

同时保留Lombok依赖以简化@Data注解的使用。

扩展说明

如果需要支持多个类的通用序列化,可以将序列化器改为泛型实现,通过反射动态处理任意类的字段,核心逻辑与上述一致,只需将MyData替换为泛型参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:01:11