如何修改Panache/Hibernate实体DTO中Jackson序列化的JSON结构?
调整JSON结构:将last_transactions移到avail同级的DTO实现方案
要实现目标JSON结构,核心是创建顶层容器DTO,让avail对象和last_transactions列表成为同级属性,具体步骤如下:
1. 修改原有AvailDTO
移除原AvailDTO中的transactions字段,让它只承载avail对象的核心数据:
@JsonTypeName("avail") @JsonPropertyOrder({ "total", "dataExtrato", "limit" }) public final class AvailDTO { public final Integer total; @JsonProperty("data_extrato") public final String dataExtrato; public final Integer limit; // 添加全参构造方法供实例化使用 public AvailDTO(Integer total, String dataExtrato, Integer limit) { this.total = total; this.dataExtrato = dataExtrato; this.limit = limit; } }
注:原有的
@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)可以保留,它会自动将AvailDTO序列化为{"avail": {...}}的结构。
2. 创建顶层响应DTO
新建一个容器DTO,同时包含AvailDTO和交易列表:
public class AvailResponseDTO { public final AvailDTO avail; @JsonProperty("last_transactions") public final List<Transactions> transactions; // 全参构造方法 public AvailResponseDTO(AvailDTO avail, List<Transactions> transactions) { this.avail = avail; this.transactions = transactions; } }
3. 业务层组装数据
在接口返回数据时,从Avail实体中拆分数据,组装成顶层DTO:
// 从数据库获取Avail实体(示例代码) Avail availEntity = Avail.findById(yourEntityId); // 构造AvailDTO(dataExtrato根据实际业务逻辑生成,比如当前时间) AvailDTO availDTO = new AvailDTO( availEntity.total, LocalDateTime.now().format(DateTimeFormatter.ISO_INSTANT), availEntity.limit ); // 构造顶层响应DTO,传入availDTO和实体中的交易列表 AvailResponseDTO responseDTO = new AvailResponseDTO(availDTO, availEntity.transactions); // 返回responseDTO即可生成目标JSON结构 return responseDTO;
效果验证
序列化后会生成你需要的JSON结构:
{ "avail": { "total": 29000, "data_extrato": "2024-02-24T11:50:15.294900Z", "limit": 100000 }, "last_transactions": [ { "value": 21000, "type": "d", "description": "withdraw", "datetime": "2024-02-24T14:46:00.904000300Z" }, { "value": 50000, "type": "c", "description": "deposit", "datetime": "2024-02-24T14:46:17.837816Z" } ] }
内容的提问来源于stack exchange,提问作者Márcio C Goulart
相关产品推荐
相关产品推荐

