本文目录如下:

  • 1. Spring Boot 默认对Json的处理

    • 1.1 创建 User 实体类
    • 1.2 创建Controller类
    • 1.3 测试不同数据类型返回的json
    • 1.4 jackson 中对null的处理
  • 2. 使用阿里巴巴FastJson的设置
    • 2.1 jackson 和 fastJson 的对比
    • 2.2 fastJson依赖导入
    • 2.2 使用 fastJson 处理 null
  • 3. 封装统一返回的数据结构
    • 3.1 定义统一的 json 结构
    • 3.2 修改 Controller 中的返回值类型及测试
  • 4. 总结

在项目开发中,接口与接口之间,前后端之间数据的传输都使用 Json 格式,在 Spring Boot 中,接口返回 Json 格式的数据很简单,在 Controller 中使用@RestController注解即可返回 Json 格式的数据,@RestController也是 Spring Boot 新增的一个注解,我们点进去看一下该注解都包含了哪些东西。

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Controller@ResponseBodypublic @interface RestController {    String value() default "";}

可以看出, @RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解,使用过 Spring 的朋友对 @Controller 注解已经非常了解了,这里不再赘述, @ResponseBody 注解是将返回的数据结构转换为 Json 格式。所以在默认情况下,使用了 @RestController 注解即可将返回的数据结构转换成 Json 格式,Spring Boot 中默认使用的 Json 解析技术框架是 jackson。我们点开 pom.xml 中的 spring-boot-starter-web 依赖,可以看到一个 spring-boot-starter-json 依赖:

    org.springframework.boot    spring-boot-starter-json    2.0.3.RELEASE    compile

Spring Boot 中对依赖都做了很好的封装,可以看到很多 spring-boot-starter-xxx 系列的依赖,这是 Spring Boot 的特点之一,不需要人为去引入很多相关的依赖了,starter-xxx 系列直接都包含了所必要的依赖,所以我们再次点进去上面这个 spring-boot-starter-json 依赖,可以看到:

    com.fasterxml.jackson.core    jackson-databind    2.9.6    compile    com.fasterxml.jackson.datatype    jackson-datatype-jdk8    2.9.6    compile    com.fasterxml.jackson.datatype    jackson-datatype-jsr310    2.9.6    compile    com.fasterxml.jackson.module    jackson-module-parameter-names    2.9.6    compile

到此为止,我们知道了 Spring Boot 中默认使用的 json 解析框架是 jackson。下面我们看一下默认的 jackson 框架对常用数据类型的转 Json 处理。

1. Spring Boot 默认对Json的处理

在实际项目中,常用的数据结构无非有类对象、List对象、Map对象,我们看一下默认的 jackson 框架对这三个常用的数据结构转成 json 后的格式如何。

1.1 创建 User 实体类

为了测试,我们需要创建一个实体类,这里我们就用 User 来演示。

public class User {    private Long id;    private String username;    private String password;  /* 省略get、set和带参构造方法 */}

1.2 创建Controller类

然后我们创建一个 Controller,分别返回 User对象、List 和 Map。

@RestController@RequestMapping("/json")public class JsonController {    @RequestMapping("/user")    public User getUser() {        return new User(1, "倪升武", "123456");    }    @RequestMapping("/list")    public List getUserList() {        List userList = new ArrayList<>();        User user1 = new User(1, "倪升武", "123456");        User user2 = new User(2, "达人课", "123456");        userList.add(user1);        userList.add(user2);        return userList;    }    @RequestMapping("/map")    public Map getMap() {        Map map = new HashMap<>(3);        User user = new User(1, "倪升武", "123456");        map.put("作者信息", user);        map.put("博客地址", "http://blog.itcodai.com");        map.put("CSDN地址", "http://blog.csdn.net/eson_15");        map.put("粉丝数量", 4153);        return map;    }}

1.3 测试不同数据类型返回的json

OK,写好了接口,分别返回了一个 User 对象、一个 List 集合和一个 Map 集合,其中 Map 集合中的 value 存的是不同的数据类型。接下来我们依次来测试一下效果。

在浏览器中输入:localhost:8080/json/user 返回 json 如下:

{"id":1,"username":"倪升武","password":"123456"}

在浏览器中输入:localhost:8080/json/list 返回 json 如下:

[{"id":1,"username":"倪升武","password":"123456"},{"id":2,"username":"达人课","password":"123456"}]

在浏览器中输入:localhost:8080/json/map 返回 json 如下:

{"作者信息":{"id":1,"username":"倪升武","password":"123456"},"CSDN地址":"http://blog.csdn.net/eson_15","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"}

可以看出,map 中不管是什么数据类型,都可以转成相应的 json 格式,这样就非常方便。

1.4 jackson 中对null的处理

在实际项目中,我们难免会遇到一些 null 值出现,我们转 json 时,是不希望有这些 null 出现的,比如我们期望所有的 null 在转 json 时都变成 "" 这种空字符串,那怎么做呢?在 Spring Boot 中,我们做一下配置即可,新建一个 jackson 的配置类:

@Configurationpublic class JacksonConfig {    @Bean    @Primary    @ConditionalOnMissingBean(ObjectMapper.class)    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {        ObjectMapper objectMapper = builder.createXmlMapper(false).build();        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {            @Override            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {                jsonGenerator.writeString("");            }        });        return objectMapper;    }}

然后我们修改一下上面返回 map 的接口,将几个值改成 null 测试一下:

@RequestMapping("/map")public Map getMap() {    Map map = new HashMap<>(3);    User user = new User(1, "倪升武", null);    map.put("作者信息", user);    map.put("博客地址", "http://blog.csdn.com/eson_15");    map.put("CSDN地址", null);    map.put("粉丝数量", 4153);    return map;}

重启项目,再次输入:localhost:8080/json/map,可以看到 jackson 已经将所有 null 字段转成了空字符串了。

{"作者信息":{"id":1,"username":"倪升武","password":""},"CSDN地址":"","粉丝数量":4153,"博客地址":"http://blog.csdn.com/eson_15"}

2. 使用阿里巴巴FastJson的设置

2.1 jackson 和 fastJson 的对比

有很多朋友习惯于使用阿里巴巴的 fastJson 来做项目中 json 转换的相关工作,目前我们项目中使用的就是阿里的 fastJson,那么 jackson 和 fastJson 有哪些区别呢?根据网上公开的资料比较得到下表。

关于 fastJson 和 jackson 的对比,网上有很多资料可以查看,主要是根据自己实际项目情况来选择合适的框架。从扩展上来看,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑,我们项目中目前使用的是阿里的 fastJson,挺方便的。

2.2 fastJson依赖导入

使用 fastJson 需要导入依赖,本课程使用 1.2.35 版本,依赖如下:

  com.alibaba  fastjson  1.2.35

2.2 使用 fastJson 处理 null

使用 fastJson 时,对 null 的处理和 jackson 有些不同,需要继承 WebMvcConfigurationSupport 类,然后覆盖 configureMessageConverters 方法,在方法中,我们可以选择对要实现 null 转换的场景,配置好即可。如下:

@Configurationpublic class fastJsonConfig extends WebMvcConfigurationSupport {    /**     * 使用阿里 FastJson 作为JSON MessageConverter     * @param converters     */    @Override    public void configureMessageConverters(List> converters) {        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();        FastJsonConfig config = new FastJsonConfig();        config.setSerializerFeatures(                // 保留map空的字段                SerializerFeature.WriteMapNullValue,                // 将String类型的null转成""                SerializerFeature.WriteNullStringAsEmpty,                // 将Number类型的null转成0                SerializerFeature.WriteNullNumberAsZero,                // 将List类型的null转成[]                SerializerFeature.WriteNullListAsEmpty,                // 将Boolean类型的null转成false                SerializerFeature.WriteNullBooleanAsFalse,                // 避免循环引用                SerializerFeature.DisableCircularReferenceDetect);        converter.setFastJsonConfig(config);        converter.setDefaultCharset(Charset.forName("UTF-8"));        List mediaTypeList = new ArrayList<>();        // 解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"        mediaTypeList.add(MediaType.APPLICATION_JSON);        converter.setSupportedMediaTypes(mediaTypeList);        converters.add(converter);    }}

3. 封装统一返回的数据结构

以上是 Spring Boot 返回 json 的几个代表的例子,但是在实际项目中,除了要封装数据之外,我们往往需要在返回的 json 中添加一些其他信息,比如返回一些状态码 code ,返回一些 msg 给调用者,这样调用者可以根据 code 或者 msg 做一些逻辑判断。所以在实际项目中,我们需要封装一个统一的 json 返回结构存储返回信息。

3.1 定义统一的 json 结构

由于封装的 json 数据的类型不确定,所以在定义统一的 json 结构时,我们需要用到泛型。统一的 json 结构中属性包括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加即可,一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。如下:

public class JsonResult {    private T data;    private String code;    private String msg;    /**     * 若没有数据返回,默认状态码为0,提示信息为:操作成功!     */    public JsonResult() {        this.code = "0";        this.msg = "操作成功!";    }    /**     * 若没有数据返回,可以人为指定状态码和提示信息     * @param code     * @param msg     */    public JsonResult(String code, String msg) {        this.code = code;        this.msg = msg;    }    /**     * 有数据返回时,状态码为0,默认提示信息为:操作成功!     * @param data     */    public JsonResult(T data) {        this.data = data;        this.code = "0";        this.msg = "操作成功!";    }    /**     * 有数据返回,状态码为0,人为指定提示信息     * @param data     * @param msg     */    public JsonResult(T data, String msg) {        this.data = data;        this.code = "0";        this.msg = msg;    }    // 省略get和set方法}

3.2 修改 Controller 中的返回值类型及测试

由于 JsonResult 使用了泛型,所以所有的返回值类型都可以使用该统一结构,在具体的场景将泛型替换成具体的数据类型即可,非常方便,也便于维护。在实际项目中,还可以继续封装,比如状态码和提示信息可以定义一个枚举类型,以后我们只需要维护这个枚举类型中的数据即可(在本课程中就不展开了)。根据以上的 JsonResult,我们改写一下 Controller,如下:

@RestController@RequestMapping("/jsonresult")public class JsonResultController {    @RequestMapping("/user")    public JsonResult getUser() {        User user = new User(1, "倪升武", "123456");        return new JsonResult<>(user);    }    @RequestMapping("/list")    public JsonResult getUserList() {        List userList = new ArrayList<>();        User user1 = new User(1, "倪升武", "123456");        User user2 = new User(2, "达人课", "123456");        userList.add(user1);        userList.add(user2);        return new JsonResult<>(userList, "获取用户列表成功");    }    @RequestMapping("/map")    public JsonResult getMap() {        Map map = new HashMap<>(3);        User user = new User(1, "倪升武", null);        map.put("作者信息", user);        map.put("博客地址", "http://blog.csdn.com/eson_15");        map.put("CSDN地址", null);        map.put("粉丝数量", 4153);        return new JsonResult<>(map);    }}

我们重新在浏览器中输入:localhost:8080/jsonresult/user 返回 json 如下:

{"code":"0","data":{"id":1,"password":"123456","username":"倪升武"},"msg":"操作成功!"}

输入:localhost:8080/jsonresult/list,返回 json 如下:

{"code":"0","data":[{"id":1,"password":"123456","username":"倪升武"},{"id":2,"password":"123456","username":"达人课"}],"msg":"获取用户列表成功"}

输入:localhost:8080/jsonresult/map,返回 json 如下:

{"code":"0","data":{"作者信息":{"id":1,"password":"","username":"倪升武"},"CSDN地址":null,"粉丝数量":4153,"博客地址":"http://blog.csdn.com/eson_15"},"msg":"操作成功!"}

通过封装,我们不但将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息,这在实际项目场景中应用非常广泛。

4. 总结

本节主要对 Spring Boot 中 json 数据的返回做了详细的分析,从 Spring Boot 默认的 jackson 框架到阿里巴巴的 fastJson 框架,分别对它们的配置做了相应的讲解。另外,结合实际项目情况,总结了实际项目中使用的 json 封装结构体,加入了状态码和提示信息,使得返回的 json 数据信息更加完整。

android responsebody转json_SpringBoot 项目开发是如何返回 json 数据以及数据封装相关推荐

  1. android客户端访问服务端,服务端返回json数据

    json这里选用了fast-json 先看服务端代码如下 package novelserver.servlet;import java.io.IOException; import java.io. ...

  2. ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

    为什么80%的码农都做不了架构师?>>>    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发          前言:本篇主要讲述数据访问层的开发, ...

  3. @ResponseBody返回JSON数据,360安全浏览器弹出下载页面

    文章目录 问题重现 解决方法 成功解决 问题重现 Controller中使用@ResponseBody返回JSON数据. @Controller public class StudentControl ...

  4. spring boot 整合web开发之文件上传、静态资源访问、异常处理、返回JSON数据

    目录 springboot 整合web开发 返回json数据 静态资源访问 文件上传 全局异常 1.返回json数据 springboot默认的是jackson-databind做为json处理器.也 ...

  5. java学习笔记——众筹项目练习——项目中的忘记密码(密码找回)与记住我(自动登录)功能 和 返回json数据低版本浏览器显示下载问题的解决、众筹系统架构重构

                                          忘记密码(密码找回) 忘记密码(密码找回)这个功能可以说是目前所有为别人提供服务的软件系统都具备的基础功能啦!很普遍,因为总 ...

  6. web项目开发 之 前端规范 --- JSON数据传输规范

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 此文严格 ...

  7. 献给初学iOS的小盆友们——微博app项目开发之七第一次获取微博数据

    上节课我们已经用request token 换取到了access token,但是经过验证我们发现,每一次输入一样的账号和密码后,获取的access token 都是一样的,也就是我们不是每次都需要获 ...

  8. 小程序快速入门到项目开发 7 (网络通讯和数据解析)

    你好,[程序职场]专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率 ...

  9. SpringBoot对于标注@ResponseBody注解返回JSON数据的处理

    前面我们已经知道,解析request要找到参数解析器和返回值处理器,而对于@ResponseBody注解的方法,其实就是其对应的返回值处理器再起作用 返回值处理器,我们知道有默认15种 : 其中处理器 ...

最新文章

  1. 开发函数计算的正确姿势 —— 爬虫
  2. ajax跨域原理以及解决方案
  3. map中批量图层的加载和展示
  4. Python3字符串切片操作代码示例
  5. spring boot web jar说明
  6. python raise语句_python中异常报错的分析处理
  7. 【渝粤题库】国家开放大学2021春2108刑法学(2)题目
  8. SQL Server cast() 批量更新列内容
  9. Linux笔记-为操作系统配ntp服务地址(适用达梦操作系统)
  10. 游戏需求,猎豹启发!揭秘华为Mate 20 X石墨烯膜散热方案出台始末
  11. php mongodb获取指定字段,Mongodb 根据子文档的某个特定字段排序的问题
  12. Java学习之路 之 提问及解决篇
  13. gateway nacos注册服务_第二篇 Spring Cloud Alibaba实战(一)Nacos服务注册与发现
  14. 转载-【常用RGB颜色查询对照表及感情色】
  15. 数据挖掘作业FCM算法
  16. Matlab在线运行网址
  17. JavaWeb题库整理
  18. 前端canvas画海报
  19. 前端Vue页面加水印方法(带源码)
  20. 如何找到一个应用的源代码

热门文章

  1. 50-10-010-配置-整体配置
  2. 【Spring】spring depend-on 到底是干什么的?
  3. 【java】java原生序列化和Kryo序列化性能实例对比分析
  4. 【Flink】Flink消费kafka 突然报错 Kafka09PartitionDiscoverer.getAllPartitionsForTopics
  5. 一款性能调优神器,1分钟定位性能瓶颈!!!
  6. 面试经常被问到这 4 大开源框架,必须得好好研究一下了!
  7. 看了这个有趣的例子,你就能秒懂Java中的多线程同步了!
  8. matlab rgb2ntsc函数,matlab 颜色模型之间的转换
  9. UML之一综合设计例题
  10. ABI 大屏(示例布局)