XML格式RESTful响应及更换默认的JSON库
- Jackson(默认,包含在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响应:
- 使用jackson-dataformat-xml的XML绑定。
- 使用JDK自带的JAXB的XML绑定。
jackson-dataformat-xml会自动将Java对象序列化为同名的XML元素,
比如
Book对象序列化为 元素,
Collection对象序列化为 元素,
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 Boot为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启用序列化。
只是在 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的解析器,但并不推荐你这么干。