1. 主页 > 好文章

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响应慢怎么优化???
试试这两个大招:

  1. 启用Gzip压缩:
properties复制
server.compression.enabled=true
  1. 用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,都是给未来的自己挖坑??!

本文由嘻道妙招独家原创,未经允许,严禁转载