成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

接口響應(yīng)以XML數(shù)據(jù)格式輸出,這些方法你都知道嗎?

開發(fā) 前端
XML與JSON都是用于數(shù)據(jù)交換的格式,但它們之間存在一些關(guān)鍵差異,決定了何時應(yīng)該使用XML而不是JSON,以及何時應(yīng)該使用JSON而不是XML?

環(huán)境:SpringBoot3.1.7 + JDK17

1. 簡介

XML與JSON都是用于數(shù)據(jù)交換的格式,但它們之間存在一些關(guān)鍵差異,決定了何時應(yīng)該使用XML而不是JSON,以及何時應(yīng)該使用JSON而不是XML?一般會從如下幾方面考慮使用哪種數(shù)據(jù)格式:

可讀性:XML 文檔具有更好的可讀性,因為它們使用類似于HTML的標(biāo)簽結(jié)構(gòu)。這對于需要人工解析和編輯的文檔特別有用。而JSON文檔的鍵值對結(jié)構(gòu)更緊湊,但在可讀性方面可能不如XML。

標(biāo)準(zhǔn)化和互操作性:XML 有一個強大的標(biāo)準(zhǔn)體系,包括 XML Schema、XSLT、XPath 等,這使得 XML 在跨平臺、跨語言的數(shù)據(jù)交換中非常受歡迎。而JSON雖然也有一些標(biāo)準(zhǔn)(如JSON Schema),但其普及度和成熟度不如XML。

數(shù)據(jù)綁定和模式:XML 支持將數(shù)據(jù)結(jié)構(gòu)與標(biāo)記語言(如 HTML)結(jié)合使用,這使得 XML 非常適合用于數(shù)據(jù)綁定。而JSON更傾向于簡單的鍵值對結(jié)構(gòu),沒有這種數(shù)據(jù)綁定功能。

數(shù)據(jù)類型:XML 支持內(nèi)置的數(shù)據(jù)類型(如整數(shù)、布爾值等),這有助于更準(zhǔn)確地表示數(shù)據(jù)。而JSON的數(shù)據(jù)類型系統(tǒng)更為簡單,只支持基本的數(shù)據(jù)類型和數(shù)組。

而如今采樣XML格式進行輸出的已經(jīng)非常少了,不過像銀行這樣的系統(tǒng)還是非常多的,最近做的一個項目與農(nóng)行對接他們的接口就是采用XML進行數(shù)據(jù)交換(真麻煩啊,不過還好之前了解過JAXB)。

接下來我們通過實例講解在SpringBoot中如何控制輸出XML數(shù)據(jù)格式

2. 實戰(zhàn)案例

2.1 通過jackson

首先需要在項目中引入jackson xml依賴包

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

隨意定義數(shù)據(jù)模型

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

Controller接口

@RestController
@RequestMapping("/mfc")
public class MessageFormatController {
  
  @GetMapping(value = "/index")
  public Object index() {
    return new Message("標(biāo)題", "內(nèi)容") ;
  }
  
}

訪問接口

圖片圖片

輸出了XML,是不是覺得非常奇怪,就引入了xml依賴什么配置都沒有就輸出了XML數(shù)據(jù)格式。這是由于在容器在初始化HttpMessageConverter消息轉(zhuǎn)換器時有判斷,如果存在XML相關(guān)的轉(zhuǎn)換起就會加入到其中。

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()));
    }
  }
}

而上面的類方法的調(diào)用是初始化HttpMessageConverters時創(chuàng)建

public class HttpMessageConvertersAutoConfiguration {
  @Bean
  @ConditionalOnMissingBean
  public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters)
    // 在該構(gòu)造方法中調(diào)用上面的方法初始化默認(rèn)的轉(zhuǎn)換器
    return new HttpMessageConverters(converters.orderedStream().toList()) ;
  }
}

這里是一個過程,其實本身MappingJackson2XmlHttpMessageConverter也被定義為bean對象了。

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

自定義XML的標(biāo)簽名稱

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

輸出如下

圖片圖片

而對于上面的接口,我們可以通過Accept請求header控制輸出的消息格式

圖片圖片

2.2 使用Xml視圖技術(shù)

@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 ;
  }
}

數(shù)據(jù)模型定義

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

輸出如下

2.3 使用JAXB技術(shù)

@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 ;
}

輸出如下

圖片

嵌套屬性支持

@XmlRootElement(name = "user")
public class User {


  private Integer age ;
  private String name ;
  private String sex ;
  @XmlElement(name = "address")
  private Address address = new Address("四川", "成都") ;
  
}

輸出

圖片圖片

以上基于JAXB需要引入如下依賴包:

<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>

以上就是有關(guān)輸出XML的所有內(nèi)容,希望本文對你有所幫助。

完畢!??!

責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2016-01-11 09:48:07

2021-08-05 18:21:29

Autowired代碼spring

2024-04-28 08:20:52

Controller接口URL

2019-02-12 11:15:15

Spring設(shè)計模式Java

2019-07-08 10:18:38

MPLSIP數(shù)據(jù)

2016-03-18 19:03:35

認(rèn)知計算IBM

2022-11-10 09:00:41

2018-08-07 09:29:35

數(shù)據(jù)庫MySQL優(yōu)化方法

2015-07-03 11:20:41

編程學(xué)習(xí)方法

2022-09-07 09:01:14

JS操作符運算符

2020-05-27 11:30:54

Chrome DevT前端命令

2021-07-29 06:55:03

Spring@AutowriedbyType注入

2023-02-15 08:12:19

http超時過濾器

2024-03-26 10:10:45

JavaScript操作符操作表達(dá)式

2020-10-28 11:20:55

vue項目技

2021-04-10 07:04:00

WPS技巧辦公軟件

2020-02-20 08:30:49

OSPF網(wǎng)絡(luò)協(xié)議路由協(xié)議

2018-02-06 09:06:03

主流分布式存儲系統(tǒng)

2023-02-01 08:31:36

JavaScript循環(huán)遍歷

2020-11-18 07:52:08

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人深夜福利网站 | 国产精品不卡 | 99视频入口 | 欧美性久久 | 日韩欧美电影在线 | 欧美日韩国产一区二区三区 | 精品一区二区电影 | 成人午夜精品 | 香蕉婷婷| 日韩欧美国产精品一区 | 999视频| 欧美一区二区三区国产 | 亚洲成人黄色 | 中文字幕国产视频 | 日韩一区二区福利视频 | 久久精品国产一区 | 免费观看的av毛片的网站 | 最新伦理片| 亚洲中午字幕 | 黄色成人免费看 | 91国内精精品久久久久久婷婷 | 特级丰满少妇一级aaaa爱毛片 | 最近免费日本视频在线 | 黄色片网此 | 成人特区| h片在线观看网站 | 在线91 | 97偷拍视频 | 国产精品国产三级国产aⅴ入口 | 久久国内精品 | 三级视频久久 | 成人精品毛片国产亚洲av十九禁 | 日韩精品一区二区三区中文在线 | 婷婷色婷婷 | 国产在线a| 久久久精品网 | 在线免费看91 | 黄色网址在线播放 | 日本免费在线观看视频 | 一级欧美日韩 | 亚洲高清视频一区二区 |