赞
踩
Jackson(默认, 功能强大的JSON库,包含在spring-boot-starter-web 这个包里面了,有 jackson 的依赖了)
Gson (Google)
JSON-B
都是 Json 解析器,功能都是把数据转换成json格式。都是用来生成JSON响应、处理JSON格式的请求参数的解析器。
Spring Boot提供了内容协商支持,默认(且优先)会根据Accept请求头来生成对应的响应。
Accept 请求头为 application/json ,则生成JSON响应
Accept 请求头为 application/xml , 则生成XML响应
控制器的方法只是返回数据(Java对象、集合)—> 通过 HttpMessageConverter 实现-------> JSON或XML
将 spring.mvc.contentnegotiation.favor-parameter 设为 true,可启用使用额外的format请求参数指定响应类型。
也可强制启用通过URL后缀来指定响应类型(这种方式已过时)。
换而言之,无论是生成JSON响应也好,还是生成XML响应也好,都需要有具体的转换器(HttpMessageConverter实现类)
Spring Boot 的 starter-web 默认会依赖 Jackson —— 功能强大的JSON库。
为了让Spring Boot将控制器返回的方法能转换成XML响应,必须添加对应XML格式化器(HttpMessageConverter实现类)
Spring Boot 之所以默认可以将控制器返回的方法能转换成JSON响应,是因为它默认依赖Jackson库
Spring Boot 内置了两种XML库的支持来让RESTful服务生成XML响应:
1、使用 jackson-dataformat-xml的 XML绑定。
2、使用JDK自带的JAXB的XML绑定。
jackson-dataformat-xml 会自动将Java对象序列化为同名的XML元素,比如
Book对象序列化为<Book.../>元素,
Collection对象序列化为<Collection.../>元素,
List对象序列序列化为<List.../>元素。
JAXB 需要使用@XmlRootElement、@XmlElement注解来指定将Java对象序列化为哪个XML元素,
因此JAXB处理起来比较麻烦,推荐使用基于jackson-dataformat-xml的XML绑定。
【总结:】 生成XML响应和生成JSON响应程序上没有任何区别,程序的控制器方法始终返回的只是数据(集合、Java对象),最终都是用Spring通过(HttpMessageConverter将数据转换成JSON响应或XML响应。
唯一的区别在于:Spring Boot的spring-boot-starter-web默认就依赖了JSON转换库(Jackson),但Spring Boot默认没有依赖XML转换器,因此需要手动在pom.xml中添加它。
上一篇:56、springboot ------ RESTful服务及RESTful接口设计
代码是上一篇基础上修改的。
演示响应为 xml 格式,通过请求的时候修改 Accept请求头来生成对应的响应,
Accept请求头为application/xml则生成XML响应
只需要添加这个依赖
<!-- 添加 Jackson format XML , 用于对象与XML之间的转换 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
执行 Accept 请求头为 xml ,响应的格式就为 xml 。
如图:通过添加配置启用额外的format请求参数指定响应类型。
就是在访问方法后面添加 ?format=json/xml 响应类型
#启用额外的format请求参数指定响应类型。
spring.mvc.contentnegotiation.favor-parameter=true
都是 Json 解析器,功能都是把数据转换成json格式。
都是用来生成JSON响应、处理JSON格式的请求参数的解析器。
如要使用Gson作为JSON解析库,只要在从依赖配置中排除spring-boot-starter-json,并添加Gson依赖库即可。
只要检测到类加载路径中包含了Gson库,Spring Boot将会自动配置一个Gson Bean,该Bean负责为Gson提供自动配置支持
spring.gson.pretty-printing:是否将JSON字符串执行格式化。
spring.gson.date-format:指定日期的序列化格式。比如yyyy-MM-dd。
spring.gson.serialize-nulls:指定是否序列化null值。
spring.gson.disable-html-escaping:指定是否禁用HTML转义。
spring.gson.disable-inner-class-serialization:指定是否禁用内部类序列化。
spring.gson.enable-complex-map-key-serialization:指定是否对复合的Map key启用序列化。
排除掉原先的 json ,然后使用 gson库
只是在 application.properties 配置文件中添加这里配置
#启用额外的format请求参数指定响应类型。
spring.mvc.contentnegotiation.favor-parameter=true
#指定日期的序列化格式
spring.gson.date-format=yyyy-MM-dd
#输出格式化良好的json数据,项目部署的时候,就设置为false,节省带宽
spring.gson.pretty-printing=true
#指定是否对复合的Map key启用序列化
spring.gson.enable-complex-map-key-serialization=true
跟用json没啥区别,都是将数据转成json格式。
都是 Json 解析器,功能都是把数据转换成json格式。
都是 Json 解析器,功能都是把数据转换成json格式。
都是用来生成JSON响应、处理JSON格式的请求参数的解析器。
如要使用JSON-B作为JSON解析库,只要在从依赖配置中排除spring-boot-starter-json,并添加JSON-B的API和实现库即可。
需要3个JAR包:
- JSON API
- JSON Bind API
- johnzon Jsonb
只要检测到类加载路径中包含了JSON-B的API和实现库,Spring Boot将会自动配置一个Jsonb Bean。
【结论】
如果要生成JSON响应、处理JSON格式的请求参数,其实用Spring Boot推荐的JACKSON就可以了。
此处教的是可以更换JSON的解析器,但并不推荐你这么干。
跟上面的没什么两样,都是能实现json格式的转化,不过此时的转化,是由 JSON-B 解析器 支持的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。