Java接收xml格式參數(shù)轉(zhuǎn)為json的方法
1、定義實(shí)體類(lèi)
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í)體類(lèi)
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í)體類(lèi)對(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類(lèi)中的字段用username就可以不需要注解;但是比如說(shuō)返回的字段是<ABC_AA>12345</ABC_AA><AAA>111</AAA>
,如果我不去規(guī)定@JsonProperty和@XmlElement,直接把字段定義成大寫(xiě)的ABC_AA和AAA,也可以接收到xml參數(shù),但是不符合Java命名規(guī)范,而且會(huì)發(fā)現(xiàn)AAA默認(rèn)轉(zhuǎn)出來(lái)的json字段叫做aaa,而ABC_AA轉(zhuǎn)出來(lái)則是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)文章
springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
為了防止數(shù)據(jù)庫(kù)被清庫(kù)或者誤刪數(shù)據(jù)庫(kù)的情況,所以需要定時(shí)將mysql數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行備份,本文主要介紹了springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01MVC頁(yè)面之間參數(shù)傳遞實(shí)現(xiàn)過(guò)程圖解
這篇文章主要介紹了MVC頁(yè)面之間參數(shù)傳遞實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Java獲取HttpServletRequest的三種方法詳解
這篇文章主要介紹了Java獲取HttpServletRequest的三種方法詳解,是一個(gè)接口,全限定名稱(chēng)為Jakarta.Serclet.http.HttpServletRequest2023-11-11
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下Java 中責(zé)任鏈模式實(shí)現(xiàn)的三種方式
本文重點(diǎn)給大家介紹java中如何編寫(xiě)責(zé)任鏈模式。主要從下面3個(gè)框架中的代碼中介紹。非常不錯(cuò),需要的朋友參考下吧2017-09-09