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

如何在不修改Java模型的情况下用Jackson生成指定格式的JSON字符串?

实现自定义JSON格式(不修改Java模型)

当然可以做到!不用修改你现有的Resource和Item类,我们可以通过自定义Jackson序列化器来实现你想要的JSON结构。下面是具体的实现步骤:

1. 创建自定义序列化器

我们需要为Resource类编写一个自定义的序列化器,继承Jackson的JsonSerializer<Resource>,重写serialize方法来手动构建目标JSON结构:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Map;

public class ResourceCustomSerializer extends JsonSerializer<Resource> {
    @Override
    public void serialize(Resource resource, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 开启外层JSON对象
        gen.writeStartObject();
        
        // 用Resource的name字段值作为数组的键
        gen.writeArrayFieldStart(resource.getName());
        
        // 遍历每个Item,合并systemFields和dataFields
        if (resource.getItems() != null) {
            for (Item item : resource.getItems()) {
                gen.writeStartObject();
                
                // 写入systemFields的所有键值对
                if (item.getSystemFields() != null) {
                    for (Map.Entry<String, String> entry : item.getSystemFields().entrySet()) {
                        gen.writeStringField(entry.getKey(), entry.getValue());
                    }
                }
                
                // 写入dataFields的所有键值对
                if (item.getDataFields() != null) {
                    for (Map.Entry<String, String> entry : item.getDataFields().entrySet()) {
                        gen.writeStringField(entry.getKey(), entry.getValue());
                    }
                }
                
                gen.writeEndObject();
            }
        }
        
        // 关闭数组和外层对象
        gen.writeEndArray();
        gen.writeEndObject();
    }
}

2. 注册序列化器到ObjectMapper

接下来,把这个自定义序列化器注册到Jackson的ObjectMapper中,这样在序列化Resource对象时就会使用我们的自定义逻辑,无需修改原模型类:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.util.List;
import java.util.Map;

public class JsonDemo {
    public static void main(String[] args) throws Exception {
        // 初始化测试数据
        Resource resource = new Resource();
        resource.setName("Person");
        
        Item item = new Item();
        item.setSystemFields(Map.of("systemField1", "xxx", "systemField2", "xxx", "systemField3", "Warsaw"));
        item.setDataFields(Map.of("dataField1", "xxx", "dataField2", "xxx", "dataField3", "xxx"));
        resource.setItems(List.of(item));
        
        // 注册自定义序列化器
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(Resource.class, new ResourceCustomSerializer());
        objectMapper.registerModule(module);
        
        // 生成带格式的JSON
        String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(resource);
        System.out.println(json);
    }
}

效果说明

运行上述代码后,生成的JSON格式完全符合你的需求:

{
  "Person" : [ {
    "systemField1" : "xxx",
    "systemField2" : "xxx",
    "systemField3" : "Warsaw",
    "dataField1" : "xxx",
    "dataField2" : "xxx",
    "dataField3" : "xxx"
  } ]
}

这种方式的优势是完全不需要改动现有的Java模型类,仅通过扩展Jackson的序列化逻辑就能实现自定义JSON结构,同时还能处理空值情况(比如items、systemFields为null时不会抛出空指针异常)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:17:26