57、 springboot 基于XML的RESTful服务---XML格式RESTful响应及更换默认的JSON库(三种JSON库的支持: Json 、 Gson、JSON-B,都是Json解析器)

XML格式RESTful响应及更换默认的JSON库

★ Spring Boot内置了如下三种JSON库的支持:

- Jackson(默认,包含在spring-boot-starter-web 这个包里面了,有jackson的依赖了)
- Gson (Google)
- JSON-B

都是 Json 解析器,功能都是把数据转换成json格式。
都是用来生成JSON响应、处理JSON格式的请求参数的解析器。

★ 基于XML的RESTful服务

▲ 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对象序列化为<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

在这里插入图片描述

★ Gson支持

都是 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启用序列化。

代码演示 Gson

排除掉原先的 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-B支持

都是 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 b 的依赖库
在这里插入图片描述

跟上面的没什么两样,都是能实现json格式的转化,不过此时的转化,是由 JSON-B 解析器 支持的
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44411039/article/details/132764996