Spring框架中高效返回JSON对象的方法详解
(抓头发)刚用Spring那会儿,我总想不通:明明照着教程写的@RestController,为啥返回的JSON有时候字段丢失?有时候变成乱七八糟的格式?这和短视频平台新手如何快速涨粉遇到的算法困惑一样,得摸清框架的脾气才行啊!
前天还有个同事吐槽:"我返回的Date类型怎么变成时间戳了?!" 这破问题足足折腾他两小时...今天咱们就掰开揉碎了说,怎么在Spring里优雅地返回JSON对象。
一、新手必踩的三个天坑
??场景1:直接甩个Map回去??
java复制@GetMapping("/user") public Map
getUser(){ Map map = new HashMap<>(); map.put("name", "张三"); map.put("age", new Object());// 这里埋雷了! return map; }
(拍大腿)这样写虽然能运行,但遇到复杂对象时,??Jackson可能序列化失败??!上周我们项目就因为有人返回包含匿名内部类的Map,直接导致线上接口500错误。
??正确姿势??:老老实实用DTO对象
java复制@Data // 记得加Lombok注解 public class UserVO { private String name; private Integer age; }
??场景2:日期格式到处乱飞??
(扶额)我见过最离谱的案例:有人给前端返回的日期字段,在Windows机器上是"yyyy/MM/dd",到Linux服务器变成"MM-dd-yyyy"...其实解决方法特简单:
java复制// application.properties里加 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
二、让JSON飞起来的实战技巧
??技巧1:玩转@JsonView??
当不同接口需要返回不同字段时,别傻乎乎建多个DTO!试试这个:
java复制public class Views { public interface SimpleView {}; public interface DetailView extends SimpleView {}; } @JsonView(Views.DetailView.class) @GetMapping("/detail") public User getDetail() { //... }
??技巧2:全局统一响应体??
(敲黑板)重要的事情说三遍:??不要直接返回实体对象!不要直接返回实体对象!??
建议封装成:
java复制public class Result
{ private int code; private String msg; private T data; // 静态工厂方法 public static Result success(T data){ return new Result<>(200, "OK", data); } }
三、你问我答环节
??Q:为啥我的Boolean字段变成true/false,前端想要1/0怎么办???
(苦笑)这问题坑过多少人?在字段上加注解:
java复制@JsonFormat(shape = JsonFormat.Shape.NUMBER) private Boolean isVip;
??Q:大JSON响应慢怎么优化???
试试这两个大招:
- 启用Gzip压缩:
properties复制server.compression.enabled=true
- 用Jackson的过滤机制:
java复制ObjectMapper mapper = new ObjectMapper(); mapper.addMixIn(SomeClass.class, FilterMixIn.class);
四、血泪教训总结
上周排查个线上问题:有个接口突然返回的JSON字段顺序乱套,导致前端解析失败。后来发现是有人把JDK从8升级到11,??HashMap的遍历顺序变了??!所以关键字段一定要用LinkedHashMap保序。
(突然想起)对了!如果你用Fastjson替换Jackson,千万记得排除依赖:
xml复制<exclusion> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> exclusion>
小编观点:搞Spring的JSON返回就像炒菜,火候(配置)和食材(数据结构)都得讲究。记住,??每次随手返回的Map,都是给未来的自己挖坑??!
本文由嘻道妙招独家原创,未经允许,严禁转载