Spring RestController返回Map对象时如何控制JSON属性的顺序
问题原因
HashMap本身基于哈希表实现,不保证元素的插入顺序,序列化JSON时读取到的键值对顺序本来就和插入顺序不一致,因此会出现返回JSON属性顺序不符合预期的问题。
解决方案
方法1:使用有序Map实现LinkedHashMap(最简便)
LinkedHashMap默认保留元素插入顺序,仅需要替换原有HashMap实现即可,代码修改如下:
@GetMapping("/balance") public Map<String, Object> fetchAccountsByBalance(){ // 将HashMap替换为LinkedHashMap Map<String, Object> response = new LinkedHashMap<>(); response.put("records", totalNumberOfRecords); response.put("pages", totalPages); response.put("data", pageResponse.getContent()); return response; }
方法2:定义专用响应实体类(生产环境推荐)
自定义接口响应DTO,通过Jackson的@JsonPropertyOrder注解显式指定序列化顺序,代码可读性和可维护性更高:
首先定义响应实体类:
import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Data; import java.util.List; @Data @JsonPropertyOrder({"records", "pages", "data"}) // 按需求指定序列化顺序 public class BalanceResponse { private Long records; private Integer pages; private List<?> data; }
修改Controller返回该实体类:
@GetMapping("/balance") public BalanceResponse fetchAccountsByBalance(){ BalanceResponse response = new BalanceResponse(); response.setRecords(totalNumberOfRecords); response.setPages(totalPages); response.setData(pageResponse.getContent()); return response; }
方法3:全局配置Jackson序列化规则(仅需按key字母排序时使用)
如果需要所有Map类型返回值都按key的字母顺序序列化,可以在Spring配置文件中添加如下配置:
# application.yml配置 spring: jackson: serialization: order-map-entries-by-keys: true
内容的提问来源于stack exchange,提问作者zilcuanu
相关产品推荐
相关产品推荐

