可讀性:XML" />
環境:SpringBoot3.1.7 + JDK17
XML與JSON都是用于數據交換的格式,但它們之間存在一些關鍵差異,決定了何時應該使用XML而不是JSON,以及何時應該使用JSON而不是XML?一般會從如下幾方面考慮使用哪種數據格式:
可讀性:XML 文檔具有更好的可讀性,因為它們使用類似于HTML的標簽結構。這對于需要人工解析和編輯的文檔特別有用。而JSON文檔的鍵值對結構更緊湊,但在可讀性方面可能不如XML。
標準化和互操作性:XML 有一個強大的標準體系,包括 XML Schema、XSLT、XPath 等,這使得 XML 在跨平臺、跨語言的數據交換中非常受歡迎。而JSON雖然也有一些標準(如JSON Schema),但其普及度和成熟度不如XML。
數據綁定和模式:XML 支持將數據結構與標記語言(如 HTML)結合使用,這使得 XML 非常適合用于數據綁定。而JSON更傾向于簡單的鍵值對結構,沒有這種數據綁定功能。
數據類型:XML 支持內置的數據類型(如整數、布爾值等),這有助于更準確地表示數據。而JSON的數據類型系統更為簡單,只支持基本的數據類型和數組。
而如今采樣XML格式進行輸出的已經非常少了,不過像銀行這樣的系統還是非常多的,最近做的一個項目與農行對接他們的接口就是采用XML進行數據交換(真麻煩啊,不過還好之前了解過JAXB)。
接下來我們通過實例講解在SpringBoot中如何控制輸出XML數據格式
首先需要在項目中引入jackson xml依賴包
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId></dependency>
隨意定義數據模型
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("標題", "內容") ; } }
訪問接口
圖片
輸出了XML,是不是覺得非常奇怪,就引入了xml依賴什么配置都沒有就輸出了XML數據格式。這是由于在容器在初始化HttpMessageConverter消息轉換器時有判斷,如果存在XML相關的轉換起就會加入到其中。
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時創建
public class HttpMessageConvertersAutoConfiguration { @Bean @ConditionalOnMissingBean public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) // 在該構造方法中調用上面的方法初始化默認的轉換器 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的標簽名稱
@JacksonXmlRootElement(localName = "msg")public class Message { private String title ; @JacksonXmlProperty(localName = "body") private String content ;}
輸出如下
圖片
而對于上面的接口,我們可以通過Accept請求header控制輸出的消息格式
圖片
@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 ; }}
數據模型定義
@XmlRootElement(name = "user")public class User { private Integer age ; private String name ; private String sex ;}
輸出如下
@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>
以上就是有關輸出XML的所有內容,希望本文對你有所幫助。
完畢!!!
本文鏈接:http://www.www897cc.com/showinfo-26-68325-0.html接口響應以XML數據格式輸出,這些方法你都知道嗎?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com