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

Spring Boot REST API生成JSON时跳过Wrapper类子对象层级

Spring Boot REST API JSON结构扁平化解决方案

下面提供几种实用的实现思路,适配Spring Boot常用的JSON序列化场景:

方法一:使用Jackson的@JsonUnwrapped注解(推荐,Spring Boot默认适配)

Spring Boot默认采用Jackson作为JSON序列化工具,直接在Maximize类的子对象字段上添加@JsonUnwrapped注解,即可自动扁平化结构:

import com.fasterxml.jackson.annotation.JsonUnwrapped;

public class Maximize {
    @JsonUnwrapped
    private Profit profit;
    
    @JsonUnwrapped
    private Stats stats;
    
    // 构造器、getter、setter方法省略
}

该注解会告诉Jackson序列化时直接展开子对象的属性,自动去除profit和stats的层级包装,完全符合你需要的输出格式。

方法二:自定义Jackson序列化器(适配复杂场景)

如果需要更灵活的序列化逻辑,可以自定义序列化器:

  1. 编写自定义序列化类:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class MaximizeSerializer extends StdSerializer<Maximize> {

    public MaximizeSerializer() {
        this(null);
    }

    public MaximizeSerializer(Class<Maximize> t) {
        super(t);
    }

    @Override
    public void serialize(Maximize maximize, JsonGenerator gen, SerializerProvider provider) throws IOException {
        // 直接写入Profit的属性
        gen.writeObjectField("request_ids", maximize.getProfit().getRequestIds());
        gen.writeNumberField("total_profit", maximize.getProfit().getTotalProfit());
        // 写入Stats的属性
        gen.writeNumberField("avg_night", maximize.getStats().getAvgNight());
        gen.writeNumberField("min_night", maximize.getStats().getMinNight());
        gen.writeNumberField("max_night", maximize.getStats().getMaxNight());
    }
}
  1. 在Maximize类上指定使用该序列化器:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@JsonSerialize(using = MaximizeSerializer.class)
public class Maximize {
    private Profit profit;
    private Stats stats;
    
    // 构造器、getter、setter方法省略
}

方法三:使用Gson自定义TypeAdapter(如果项目依赖Gson)

如果项目使用Gson作为序列化工具,可通过自定义TypeAdapter实现扁平化:

  1. 编写TypeAdapter类:
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.util.List;

public class MaximizeTypeAdapter extends TypeAdapter<Maximize> {
    @Override
    public void write(JsonWriter out, Maximize value) throws IOException {
        out.beginObject();
        // 写入Profit的属性
        out.name("request_ids");
        new Gson().getAdapter(List.class).write(out, value.getProfit().getRequestIds());
        out.name("total_profit").value(value.getProfit().getTotalProfit());
        // 写入Stats的属性
        out.name("avg_night").value(value.getStats().getAvgNight());
        out.name("min_night").value(value.getStats().getMinNight());
        out.name("max_night").value(value.getStats().getMaxNight());
        out.endObject();
    }

    @Override
    public Maximize read(JsonReader in) throws IOException {
        // 反序列化逻辑按需实现
        return null;
    }
}
  1. 注册TypeAdapter到Gson实例:
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Maximize.class, new MaximizeTypeAdapter())
    .create();
// 序列化时使用该Gson实例生成JSON
String json = gson.toJson(maximizeObject);

方法四:创建扁平化DTO(不修改原领域类)

如果不想改动原Maximize领域类,可以创建专门的DTO用于返回数据:

import java.util.List;

public class MaximizeFlatDTO {
    private List<String> request_ids;
    private int total_profit;
    private int avg_night;
    private int min_night;
    private int max_night;
    
    // 通过Maximize对象初始化DTO
    public MaximizeFlatDTO(Maximize maximize) {
        this.request_ids = maximize.getProfit().getRequestIds();
        this.total_profit = maximize.getProfit().getTotalProfit();
        this.avg_night = maximize.getStats().getAvgNight();
        this.min_night = maximize.getStats().getMinNight();
        this.max_night = maximize.getStats().getMaxNight();
    }
    
    // getter、setter方法省略
}

在Controller中直接返回该DTO对象即可得到扁平化的JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:20:16