当前位置:首页 > 科技  > 软件

接口响应以XML数据格式输出,这些方法你都知道吗?

来源: 责编: 时间:2024-01-26 09:02:19 353观看
导读环境:SpringBoot3.1.7 + JDK171. 简介XML与JSON都是用于数据交换的格式,但它们之间存在一些关键差异,决定了何时应该使用XML而不是JSON,以及何时应该使用JSON而不是XML?一般会从如下几方面考虑使用哪种数据格式:
可读性:XML

环境:SpringBoot3.1.7 + JDK17j8j28资讯网——每日最新资讯28at.com

1. 简介

XML与JSON都是用于数据交换的格式,但它们之间存在一些关键差异,决定了何时应该使用XML而不是JSON,以及何时应该使用JSON而不是XML?一般会从如下几方面考虑使用哪种数据格式:
j8j28资讯网——每日最新资讯28at.com

可读性:XML 文档具有更好的可读性,因为它们使用类似于HTML的标签结构。这对于需要人工解析和编辑的文档特别有用。而JSON文档的键值对结构更紧凑,但在可读性方面可能不如XML。j8j28资讯网——每日最新资讯28at.com

标准化和互操作性:XML 有一个强大的标准体系,包括 XML Schema、XSLT、XPath 等,这使得 XML 在跨平台、跨语言的数据交换中非常受欢迎。而JSON虽然也有一些标准(如JSON Schema),但其普及度和成熟度不如XML。j8j28资讯网——每日最新资讯28at.com

数据绑定和模式:XML 支持将数据结构与标记语言(如 HTML)结合使用,这使得 XML 非常适合用于数据绑定。而JSON更倾向于简单的键值对结构,没有这种数据绑定功能。j8j28资讯网——每日最新资讯28at.com

数据类型:XML 支持内置的数据类型(如整数、布尔值等),这有助于更准确地表示数据。而JSON的数据类型系统更为简单,只支持基本的数据类型和数组。j8j28资讯网——每日最新资讯28at.com

而如今采样XML格式进行输出的已经非常少了,不过像银行这样的系统还是非常多的,最近做的一个项目与农行对接他们的接口就是采用XML进行数据交换(真麻烦啊,不过还好之前了解过JAXB)。j8j28资讯网——每日最新资讯28at.com

接下来我们通过实例讲解在SpringBoot中如何控制输出XML数据格式j8j28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 通过jackson

首先需要在项目中引入jackson xml依赖包j8j28资讯网——每日最新资讯28at.com

<dependency>  <groupId>com.fasterxml.jackson.dataformat</groupId>  <artifactId>jackson-dataformat-xml</artifactId></dependency>

随意定义数据模型j8j28资讯网——每日最新资讯28at.com

public class Message {  private String title ;  private String content ;}

Controller接口j8j28资讯网——每日最新资讯28at.com

@RestController@RequestMapping("/mfc")public class MessageFormatController {    @GetMapping(value = "/index")  public Object index() {    return new Message("标题", "内容") ;  }  }

访问接口j8j28资讯网——每日最新资讯28at.com

图片图片j8j28资讯网——每日最新资讯28at.com

输出了XML,是不是觉得非常奇怪,就引入了xml依赖什么配置都没有就输出了XML数据格式。这是由于在容器在初始化HttpMessageConverter消息转换器时有判断,如果存在XML相关的转换起就会加入到其中。j8j28资讯网——每日最新资讯28at.com

public class WebMvcConfigurationSupport {  private static final boolean jackson2XmlPresent;  static {    jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader);  }  protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {    if (jackson2XmlPresent) {      Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();      if (this.applicationContext != null) {        builder.applicationContext(this.applicationContext);      }      messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));    }  }}

而上面的类方法的调用是初始化HttpMessageConverters时创建j8j28资讯网——每日最新资讯28at.com

public class HttpMessageConvertersAutoConfiguration {  @Bean  @ConditionalOnMissingBean  public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters)    // 在该构造方法中调用上面的方法初始化默认的转换器    return new HttpMessageConverters(converters.orderedStream().toList()) ;  }}

这里是一个过程,其实本身MappingJackson2XmlHttpMessageConverter也被定义为bean对象了。j8j28资讯网——每日最新资讯28at.com

protected static class MappingJackson2XmlHttpMessageConverterConfiguration {  @Bean  @ConditionalOnMissingBean  public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(      Jackson2ObjectMapperBuilder builder) {    return new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build());  }}

自定义XML的标签名称j8j28资讯网——每日最新资讯28at.com

@JacksonXmlRootElement(localName = "msg")public class Message {  private String title ;  @JacksonXmlProperty(localName = "body")  private String content ;}

输出如下j8j28资讯网——每日最新资讯28at.com

图片图片j8j28资讯网——每日最新资讯28at.com

而对于上面的接口,我们可以通过Accept请求header控制输出的消息格式j8j28资讯网——每日最新资讯28at.com

图片图片j8j28资讯网——每日最新资讯28at.com

2.2 使用Xml视图技术

@RestController@RequestMapping("/jaxb")public class JaxbController {  @GetMapping("/xml")  public ModelAndView xml() {    MappingJackson2XmlView view = new MappingJackson2XmlView() ;    ModelAndView model = new ModelAndView(view) ;    Map<String, Object> modelMap = new HashMap<>() ;    modelMap.put("user", new User(66, "张三", "女")) ;    modelMap.put("zs", new User(55, "李四", "男")) ;    view.setModelKey("zs") ;    model.addAllObjects(modelMap) ;    return model ;  }}

数据模型定义j8j28资讯网——每日最新资讯28at.com

@XmlRootElement(name = "user")public class User {  private Integer age ;  private String name ;  private String sex ;}

输出如下j8j28资讯网——每日最新资讯28at.com

j8j28资讯网——每日最新资讯28at.com

2.3 使用JAXB技术

@GetMapping("/marshaller")public MarshallingView marshaller() {  Jaxb2Marshaller marshaller = new Jaxb2Marshaller() ;  marshaller.setClassesToBeBound(User.class) ;  MarshallingView view = new MarshallingView(marshaller) ;  view.getAttributesMap().put("user", new User(22, "张三", "男")) ;  return view ;}

输出如下j8j28资讯网——每日最新资讯28at.com

图片j8j28资讯网——每日最新资讯28at.com

嵌套属性支持j8j28资讯网——每日最新资讯28at.com

@XmlRootElement(name = "user")public class User {  private Integer age ;  private String name ;  private String sex ;  @XmlElement(name = "address")  private Address address = new Address("四川", "成都") ;  }

输出j8j28资讯网——每日最新资讯28at.com

图片图片j8j28资讯网——每日最新资讯28at.com

以上基于JAXB需要引入如下依赖包:j8j28资讯网——每日最新资讯28at.com

<dependency>  <groupId>jakarta.xml.bind</groupId>  <artifactId>jakarta.xml.bind-api</artifactId></dependency><dependency>  <groupId>org.glassfish.jaxb</groupId>  <artifactId>jaxb-runtime</artifactId></dependency><dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-oxm</artifactId></dependency>

以上就是有关输出XML的所有内容,希望本文对你有所帮助。j8j28资讯网——每日最新资讯28at.com

完毕!!!j8j28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-68325-0.html接口响应以XML数据格式输出,这些方法你都知道吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Dalvik与ART的架构差异,你学会了吗?

下一篇: 如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top