如何在不修改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
相关产品推荐
相关产品推荐

