Java接收xml格式參數(shù)轉(zhuǎn)為json的方法
1、定義實(shí)體類
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "User")
@Setter
@ToString
public class User {
private String name;
@XmlElement(name = "username")
public String getName() {
return name;
}
}注意這里需要把@XmlElement注解用在get方法上,實(shí)際使用時(shí)發(fā)現(xiàn)如果直接作用在字段上會(huì)報(bào)錯(cuò)。
2、使用jaxb對(duì)接 轉(zhuǎn)為實(shí)體類
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public User fromXml(String xmlData) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (User) unmarshaller.unmarshal(new StringReader(xmlData));
}這里的xmlData示例:<User><username>yogima<username></User>
就可以轉(zhuǎn)換到實(shí)體類對(duì)應(yīng)的字段中了
3、轉(zhuǎn)為json
import com.fasterxml.jackson.databind.ObjectMapper;
public String toJson(User user) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(user);
}實(shí)際上返回給前端的時(shí)候也不需要自己手動(dòng)去writeValueAsString,這里只是做個(gè)示例。
上述轉(zhuǎn)為json后字段名使用的還是name,如果需要保持字段名為"username",只需要加上@JsonProperty。
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.fasterxml.jackson.annotation.JsonProperty;
@XmlRootElement(name = "User")
@Setter
@ToString
public class User {
@JsonProperty("username")
private String name;
@XmlElement(name = "username")
public String getName() {
return name;
}
}這樣看注解有時(shí)候還挺多此一舉的,直接User類中的字段用username就可以不需要注解;但是比如說返回的字段是<ABC_AA>12345</ABC_AA><AAA>111</AAA>,如果我不去規(guī)定@JsonProperty和@XmlElement,直接把字段定義成大寫的ABC_AA和AAA,也可以接收到xml參數(shù),但是不符合Java命名規(guī)范,而且會(huì)發(fā)現(xiàn)AAA默認(rèn)轉(zhuǎn)出來的json字段叫做aaa,而ABC_AA轉(zhuǎn)出來則是abc_AA.所以我們還是加上注釋會(huì)更優(yōu)雅一些。
@JsonProperty("ABC_AA")
private String abcAa;
@XmlElement(name = "ABC_AA")
public String getAbcAa() {
return abcAa;
}4、返回的xml較為復(fù)雜,需要提取
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class XmlConvertTest {
public static void main(String[] args) throws Exception{
//模擬較為復(fù)雜的xml數(shù)據(jù)
String xmlData = "<response><head><response_id>AA</response_id><status_code>200</status_code></head><result><![CDATA[<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>]]></result></response>";
//使用正則取出需要的數(shù)據(jù)內(nèi)容 即<row><AAA>111</AAA><BBB>222</BBB></row><row><AAA>333</AAA><BBB>444</BBB></row>
String cdataContent = xmlData.replaceAll("(?s).*?<result><!\\[CDATA\\[(.*?)]]></result>.*", "$1");
// 如果需要提取head部分 即<response_id>AA</response_id><status_code>200</status_code>
// String headContent = xmlData.replaceAll("(?s).*?<head>(.*?)</head>.*", "$1");
//裹上rows
String wrappedContent = "<rows>" + cdataContent + "</rows>";
JAXBContext jaxbContext = JAXBContext.newInstance(XmlTestDTO.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
XmlTestDTO dto = (XmlTestDTO) unmarshaller.unmarshal(new StringReader(wrappedContent));
System.out.println(dto);
}對(duì)應(yīng)的XmlTestDTO:
@XmlRootElement(name = "rows")
@Setter
@ToString
public class XmlTestDTO {
private List<XmlRowTest> rows = new ArrayList<>();
@XmlElement(name = "row") // 對(duì)應(yīng)每個(gè) <row> 元素
public List<XmlRowTest> getRows() {
return rows;
}
//XmlRowTest不需要作為根元素的話,這里可以不用@XmlRootElement注解
//@XmlRootElement(name = "row")
@Setter
@ToString
public static class XmlRowTest{
@JsonProperty("AAA")
private String aaa;
@XmlElement(name = "AAA")
public String getAaa() {
return aaa;
}
}
}拿到XmlTestDTO dto后只要使用dto.getRows()就能對(duì)List<XmlRowTest>進(jìn)行遍歷了
到此這篇關(guān)于Java接收xml格式參數(shù)轉(zhuǎn)為json的文章就介紹到這了,更多相關(guān)java xml轉(zhuǎn)為json內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中bcrypt算法實(shí)現(xiàn)密碼加密的方法步驟
我們可以在Spring Boot和SSM中實(shí)現(xiàn)密碼加密,使用bcrypt算法可以保障密碼的安全性,并且減少了手動(dòng)編寫哈希函數(shù)的工作量,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下2023-08-08
Intellij idea遠(yuǎn)程debug連接tomcat實(shí)現(xiàn)單步調(diào)試
這篇文章主要介紹了Intellij idea遠(yuǎn)程debug連接tomcat實(shí)現(xiàn)單步調(diào)試,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
SpringBoot多數(shù)據(jù)庫(kù)連接(mysql+oracle)的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot多數(shù)據(jù)庫(kù)連接(mysql+oracle)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java如何找出數(shù)組中重復(fù)的數(shù)字
這篇文章主要為大家詳細(xì)介紹了Java如何找出數(shù)組中重復(fù)的數(shù)字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Java使用POI解析帶圖片的excel文件(簡(jiǎn)潔好用!)
這篇文章主要給大家介紹了關(guān)于Java如何使用POI解析帶圖片的excel文件的相關(guān)資料,最近項(xiàng)目需要讀取excel中的信息,帶圖片,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-08-08
WebSocket+Vue+SpringBoot實(shí)現(xiàn)語(yǔ)音通話的使用示例
本文主要介紹了WebSocket+Vue+SpringBoot實(shí)現(xiàn)語(yǔ)音通話的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
idea創(chuàng)建maven父子工程導(dǎo)致子工程無法導(dǎo)入父工程依賴
創(chuàng)建maven父子工程時(shí)遇到一個(gè)問題,本文主要介紹了idea創(chuàng)建maven父子工程導(dǎo)致子工程無法導(dǎo)入父工程依賴,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
關(guān)于IDEA創(chuàng)建spark maven項(xiàng)目并連接遠(yuǎn)程spark集群?jiǎn)栴}
這篇文章主要介紹了IDEA創(chuàng)建spark maven項(xiàng)目并連接遠(yuǎn)程spark集群,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

