irpas技术客

Spring Boot返回JSON数据(三种方式)_Eternal_Summer-_springboot 返回json

网络投稿 1094

Spring Boot返回JSON数据(三种方式) 默认实现使用Gson使用fastjson 1. 默认实现

? spring-boot-starter-web依赖默认加入了jackson-databind作为json处理器,此时不需要添加额外的JSON处理器就能返回一段JSON了。

? 创建一个Book实体类:

package com.itlearn.springboot06json.beans; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import java.util.Date; @Data public class Book { private String name; private String author; @JsonIgnore private Double price; @JsonFormat(pattern = "yyyy-MM-dd") private Date cationDate; }

@JsonIgnore:转换json的时候忽略此属性

@JsonFormat(pattern = “yyyy-MM-dd”):对该属性的值进行格式化

创建BookController,返回Book对象

@RestController public class BookController { @GetMapping("/book") public Book book(){ Book book = new Book(); book.setName("三国演义"); book.setAuthor("罗贯中"); book.setPrice(30D); book.setCationDate(new Date()); return book; }

页面显示如下:

{"name":"三国演义","author":"罗贯中","cationDate":"2021-05-03"} 2. 使用Gson

? Gson是Google的一个开源JSON解析框架。使用Gson,需要先除去默认的jackson-databind,然后加入Gson依赖。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency>

? 由于Spring Boot中默认提供了Gson的自动转换类:GsonHttpMessageConvertersConfigureation,因此Gson依赖添加后,可以像使用Jackson-databind那样直接使用Gson。**但是在Gson进行转换时,如果想对日期进行格式化,那么还需要开发者自定义HttpMessageConverter。**如下:

package com.itlearn.spriingboot06gson.gson; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.GsonHttpMessageConverter; import java.lang.reflect.Modifier; @Configuration public class GsonConfig { @Bean public GsonHttpMessageConverter gsonHttpMessageConverter(){ GsonHttpMessageConverter converter = new GsonHttpMessageConverter(); GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("yyyy-MM-dd"); builder.excludeFieldsWithModifiers(Modifier.PROTECTED); Gson gson = builder.create(); converter.setGson(gson); return converter; } }

开发者自己提供的一个GsonHttpMessageConverter实例

设置了Gson解析日期的转化格式

设置Gson解析时修饰符为protected的字段被过滤掉。(可自行选择)

创建Book实例

@Data public class Book { private String name; private String author; protected Double price; private Date cationDate; }

? 添加Controller:

@RestController public class BookController { @GetMapping("/book") public Book book(){ Book book = new Book(); book.setName("三国演义"); book.setAuthor("罗贯中"); book.setPrice(30D); book.setCationDate(new Date()); return book; } }

页面打开如下:

{"name":"三国演义","author":"罗贯中","cationDate":"2021-05-03"} 3. 使用fastjson(两种方式)

? fastjson是阿里巴巴的一个开源JSON解析框架,是目前JSON解析速度最快的开源框架。Spring Boot继承fastjson后不能立马使用,需要开发者提供HttpMessageConverter后才能使用,继承步骤如下:

首先除去jackson-databind依赖,引入fastjson依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> 3.1. 使用配置fastjson的HttpMessageConverter

配置fastjson的HttpMessageConverter

@Configuration public class MyFastJsonConfig { @Bean public FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){ FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM-dd"); config.setCharset(Charset.forName("UTF-8")); /* * WriteClassName:是否在生成的JSON中输出类名 * WriteMapNullValue:是否输出value为null的数据 * PrettyFormat:生成的JSON格式化 * WriteNullListAsEmpty:空集合输出[]而非null * WriteNullStringAsEmpty:空字符串输出“”而非null */ config.setSerializerFeatures( SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty ); converter.setFastJsonConfig(config); return converter; } } 自定义MyFastJsonConfig,完成对FastJsonHttpMessageConverter Bean的提供

配置响应编码:

server.port=8081 #编码格式 server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.tomcat.uri-encoding=UTF-8

Controller、Bean同上

页面输出如下:

{ "@type":"com.itlearn.springboot06fastjson.beans.Book", "author":"罗贯中", "cationDate":"2021-05-03", "name":"三国演义", "price":30.0D } 3.2. 实现WebMvcConfigure接口

? 在Spring Boot项目中,当开发者引入spring-boot-starter-web依赖后,该依赖又依赖了spring-boot-autoconfigure,在这个自动化配置中,有一个WebMvcAutoConfigureation类提供了对Spring MVC最基本的配置,如果某一项自动化配置不满足开发需求,开发者可针对该项目自定义配置,只需要实现WebMvcConfigurer接口即可。(spring 5.0之前是通过继承WebMvcConfigurerAdapter类实现的)

@Configuration public class MyWebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM-dd"); config.setCharset(Charset.forName("UTF-8")); config.setSerializerFeatures( SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty ); converter.setFastJsonConfig(config); converters.add(converter); } }

页面显示:

{ "@type":"com.itlearn.springboot06fastjson.beans.Book", "author":"罗贯中", "cationDate":"2021-05-03", "name":"三国演义", "price":30.0D }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #springboot #返回json #Spring