Spring Boot返回Json数据及数据封装 | 您所在的位置:网站首页 › json转成类 › Spring Boot返回Json数据及数据封装 |
1.1 简介 在项目开发中,接口与接口之间,前后端之间数据的传输都使用Json 格式,在Spring Boot中,接口返回 Json格式的数据很简单,在 Controller 中使用@RestController注解即可返回 Json格式的数据,@RestController也是 Spring Boot新增的一个注解,我们点进去看一下该注解都包含了哪些东西。 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Controller @ResponseBody public @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.2 Spring Boot 默认对Json的处理 在实际项目中,常用的数据结构无非有类对象、List对象、Map对象,我们看一下默认的jackson 框架对这三个常用的数据结构转成 json后的格式如何。1.2.1 创建 User实体类 为了测试,我们需要创建一个实体类,这里我们就用 User 来演示。 public class User { private Long id; private String username; private String password; /* 省略get、set和带参构造方法 */ }1.2.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://"); map.put("CSDN地址", "http://"); map.put("粉丝数量", 4153); return map; } }
1.2.3 测试不同数据类型返回的json OK,写好了接口,分别返回了一个User 对象、一个List集合和一个Map集合,其中Map 集合中的 value存的是不同的数据类型。接下来我们依次来测试一下效果。 在浏览器中输入:localhost:8080/json/user返回 json 如下: {"id":1,"username":"倪升武","password":"123456"} 1 在浏览器中输入:localhost:8080/json/list返回 json 如下: [{"id":1,"username":"倪升武","password":"123456"},{"id":2,"username":"达人课","password":"123456"}] 1 在浏览器中输入:localhost:8080/json/map 返回 json 如下: {"作者信息":{"id":1,"username":"倪升武","password":"123456"},"CSDN地址":"http://blog.csdn.net/eson_15","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"} 1 可以看出,map中不管是什么数据类型,都可以转成相应的json格式,这样就非常方便。 1.2.4 jackson 中对null的处理 在实际项目中,我们难免会遇到一些 null值出现,我们转json 时,是不希望有这些 null出现的,比如我们期望所有的null在转json时都变成“”这种空字符串,那怎么做呢?在Spring Boot中,我们做一下配置即可,新建一个jackson 的配置类: import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.io.IOException; @Configuration public 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://"); map.put("CSDN地址", null); map.put("粉丝数量", 4153); return map; }
重启项目,再次输入:localhost:8080/json/map,可以看到jackson已经将所有null字段转成了空字符串了。 {"作者信息":{"id":1,"username":"倪升武","password":""},"CSDN地址":"","粉丝数量":4153,"博客地址":"http://blog.itcodai.com"} 1 1.3 使用阿里巴巴FastJson的设置1.3.1 jackson和fastJson的对比 有很多朋友习惯于使用阿里巴巴的fastJson 来做项目中 json转换的相关工作,目前我们项目中使用的就是阿里的fastJson,那么jackson 和 fastJson 有哪些区别呢?根据网上公开的资料比较得到下表。 选项fastJsonjackson 上手难易程度 容易 中等 高级特性支持 中等 丰富 官方文档、Example支持 中文 英文 处理json速度 略快 快1.3.2 fastJson依赖导入 使用fastJson 需要导入依赖,本课程使用1.2.35 版本,依赖如下: com.alibaba fastjson 1.2.35
1.3.3 使用fastJson处理null 使用fastJson 时,对 null的处理和jackson有些不同,需要继承WebMvcConfigurationSupport 类,然后覆盖 configureMessageConverters方法,在方法中,我们可以选择对要实现 null转换的场景,配置好即可。如下: import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; @Configuration public class fastJsonConfig extends WebMvcConfigurationSupport { /** * 使用阿里 FastJson 作为JSON MessageConverter * @param converters */ @Override public void configureMessageConverters(List |
CopyRight 2018-2019 实验室设备网 版权所有 |