SpringBoot基于JAXB實(shí)現(xiàn)天地圖路徑規(guī)劃結(jié)果XML轉(zhuǎn)JSON
前言
在之前的博文中在SpringBoot中使用UniHttp簡(jiǎn)化天地圖路徑規(guī)劃調(diào)用實(shí)踐。在這篇文章中,我們實(shí)現(xiàn)了在SpringBoot中調(diào)用天地圖的Web接口調(diào)用,從而獲取相應(yīng)駕車的路徑規(guī)劃信息。雖然整體的流程已經(jīng)走通了,但是在天地圖的路徑規(guī)劃接口的響應(yīng)參數(shù)中,返回的數(shù)據(jù)格式是xml的。雖然xml也可以作為一種標(biāo)準(zhǔn)的接口傳輸數(shù)據(jù)類型,但是現(xiàn)代的接口調(diào)用中,通常返回的數(shù)據(jù)類型基本是以JSON為主。為了讓接口更加具有通用性,可以對(duì)接更多的第三方接口,為別的業(yè)務(wù)平臺(tái)提供更好的服務(wù)。將天地圖返回的XML轉(zhuǎn)換為標(biāo)準(zhǔn)的JSON數(shù)據(jù)也就非常有必要。
本文即在這樣的背景下產(chǎn)生,博文首先對(duì)天地圖返回的XML信息元素進(jìn)行詳細(xì)的介紹,包括其主要的子元素等方面,然后介紹在SpringBoot中使用JAXB實(shí)現(xiàn)對(duì)路徑規(guī)劃的對(duì)應(yīng)的一一映射配置,最后完整的實(shí)現(xiàn)將天地圖的路徑規(guī)劃的XML數(shù)據(jù)轉(zhuǎn)為JSON格式。如果您當(dāng)前也有業(yè)務(wù)是基于天地圖來(lái)構(gòu)建,如果在構(gòu)建相關(guān)服務(wù)的過(guò)程中也有需要將XML進(jìn)行對(duì)應(yīng)的處理,不妨來(lái)這里看看。
一、路徑規(guī)劃返回參數(shù)簡(jiǎn)介
本節(jié)將對(duì)基于天地圖的路徑規(guī)劃服務(wù)接口中的返回參數(shù)進(jìn)行詳細(xì)介紹。尤其是對(duì)其返回的XML返回參數(shù)的格式以及攜帶的子參數(shù)進(jìn)行重點(diǎn)介紹。這將是文章的重點(diǎn)內(nèi)容對(duì)如何構(gòu)建對(duì)應(yīng)的對(duì)象信息至關(guān)重要,請(qǐng)務(wù)必掌握這里的知識(shí)。這里分兩個(gè)部分來(lái)進(jìn)行,首先是對(duì)返回的XML對(duì)象進(jìn)行梳理,對(duì)齊包含的屬性和子元素信息進(jìn)行介紹,最后是一個(gè)實(shí)例的介紹。
1、返回xml梳理
首先還是從官網(wǎng)入手,先來(lái)看一下天地圖的返回參數(shù)的介紹,天地圖駕車路徑規(guī)劃API地址,在瀏覽器中輸入以上的地址后,可以在其網(wǎng)站上看到以下的返回參數(shù)信息:
完整的XML響應(yīng)內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8" ?> <result orig='起點(diǎn)經(jīng)緯度' mid='途徑點(diǎn)信息' dest='終點(diǎn)經(jīng)緯度'> <parameters> <orig>起點(diǎn)加密經(jīng)緯度</orig> <dest>終點(diǎn)加密經(jīng)緯度</dest> <mid>途徑點(diǎn)加密經(jīng)緯度集合</mid> <key>經(jīng)緯度加密的 key 值</key> <width>地圖寬度</width> <height>地圖高度</height> <style>導(dǎo)航路線類型</style> <version>版本控制</version> <sort>排序方式</sort> </parameters> <routes count='分段總數(shù)' time='查詢時(shí)間'> <item id='0'> <strguide>每段線路文字描述</strguide> <signage>“路牌”引導(dǎo)提示/高速路收費(fèi)站出口信息</signage> <streetName>當(dāng)前路段名稱</streetName> <nextStreetName>下一段道路名稱</nextStreetName> <tollStatus>道路收費(fèi)信息(0=免費(fèi)路段,1=收費(fèi)路段,2=部分收費(fèi)路段)</tollStatus> <turnlatlon>轉(zhuǎn)折點(diǎn)經(jīng)緯度</turnlatlon> </item> <item id='1'> .... </item> ....其他分段線路信息 </routes> <simple> <item id='0'> <strguide>每段線路文字描述</strguide> <streetNames>當(dāng)前行駛路段名稱(含多個(gè)路段)</streetNames> <lastStreetName>最后一段道路名稱</lastStreetName> <linkStreetName>合并段之間銜接的道路名稱</linkStreetName> <signage>“路牌”引導(dǎo)提示/高速路收費(fèi)站出口信息</signage> <tollStatus>道路收費(fèi)信息(0=免費(fèi)路段,1=收費(fèi)路段,2=部分收費(fèi)路段)</tollStatus> <turnlatlon>轉(zhuǎn)折點(diǎn)經(jīng)緯度</turnlatlon> <streetLatLon>線路經(jīng)緯度</streetLatLon> <streetDistance>行駛總距離(單位:米)</streetDistance> <segmentNumber>合并后的號(hào)段,對(duì)應(yīng)詳細(xì)描述中的號(hào)段</segmentNumber> </item> <item id='1'> .... </item> ....其他分段線路信息 </simple> <distance>全長(zhǎng)(單位:公里)</distance> <duration>行駛總時(shí)間(單位:秒)</duration> <routelatlon>線路經(jīng)緯度字符串</routelatlon> <mapinfo> <center>全部結(jié)果同時(shí)顯示的適宜中心經(jīng)緯度</center> <scale>全部結(jié)果同時(shí)顯示的適宜縮放比例</scale> </mapinfo> </result>
從以上的思維導(dǎo)圖中可以看到,天地圖的路徑規(guī)劃接口返回的XML類型的數(shù)據(jù)中,其主要包含了這7類數(shù)據(jù),1是請(qǐng)求的參數(shù)信息,2是 完整的路徑規(guī)劃信息,3是簡(jiǎn)化的路徑規(guī)劃信息,但是路徑規(guī)劃的詳細(xì)內(nèi)容會(huì)稍微多一點(diǎn),4是導(dǎo)航全程的距離,5是行駛的總時(shí)間,6是路線經(jīng)緯度字符串,7是地圖展示信息。
2、返回xml實(shí)例
下面依然以從長(zhǎng)沙黃花機(jī)場(chǎng)到橘子洲的路徑規(guī)劃結(jié)果來(lái)對(duì)返回參數(shù)進(jìn)行綜合介紹。為了減少對(duì)篇幅的占用,這里我展示的是簡(jiǎn)單樣例部分的數(shù)據(jù)。如下圖所示:
按照前面內(nèi)容展示信息,我們以簡(jiǎn)化后的路徑規(guī)劃內(nèi)容為例進(jìn)行展示,可以看到全程路程大約31.13公里,行駛距離大約是2667.0秒,等于 44.5分鐘。在城區(qū)中形式,這個(gè)速度應(yīng)該是差不多的。從黃花機(jī)場(chǎng)到橘子洲的大約形式路線如下:
先從起始點(diǎn)出發(fā),進(jìn)入遠(yuǎn)大一路/國(guó)道107,距離大約101米,然后沿遠(yuǎn)大一路/國(guó)道107,遠(yuǎn)大二路/省道103,車站中路/國(guó)道107,遠(yuǎn)大三路/省道103,省道103,五一大道/國(guó)道107,機(jī)場(chǎng)大道行駛,進(jìn)入橘洲路,這里行駛的距離大約是30771米,最后是沿橘洲路行駛到目的地,大約262米的樣子。
二、JAXB技術(shù)介紹
本節(jié)將重點(diǎn)介紹JAXB的相關(guān)技術(shù),主要從以下兩個(gè)方面進(jìn)行介紹。第一JAXB是什么?其次是JAXB能做什么?
1、JAXB是什么
JAXB(Java Architecture for XML Binding)是一種Java技術(shù),它允許Java開(kāi)發(fā)人員將Java對(duì)象映射為XML表示方式,并支持將XML實(shí)例文檔轉(zhuǎn)換為Java對(duì)象。 JAXB的主要功能包括將Java對(duì)象序列化為XML文檔,以及將XML文檔解析為Java對(duì)象。這使得開(kāi)發(fā)者可以方便地在Java應(yīng)用程序中處理XML數(shù)據(jù),而不需要編寫特定的XML解析代碼。
JAXB通過(guò)使用注解來(lái)定義Java類與XML文檔之間的映射關(guān)系。常用的注解包括@XmlRootElement、@XmlElement等,這些注解幫助開(kāi)發(fā)者指定如何將Java對(duì)象轉(zhuǎn)換為XML格式,以及如何從XML格式解析數(shù)據(jù)。
2、JAXB能做什么
JAXB的應(yīng)用場(chǎng)景
Web服務(wù):在Web服務(wù)中,JAXB可以將Java對(duì)象序列化為XML文檔,以便在不同系統(tǒng)之間進(jìn)行數(shù)據(jù)交換。XML文件讀寫:在讀寫XML文件時(shí),JAXB可以將XML文檔轉(zhuǎn)換為Java對(duì)象,以便進(jìn)行操作和處理。SOAP消息處理:在SOAP(Simple Object Access Protocol)消息處理中,JAXB可以用于將Java對(duì)象轉(zhuǎn)換為SOAP消息,或?qū)OAP消息轉(zhuǎn)換為Java對(duì)象。
JAXB是JDK 1.8中自帶的類。JAXB(Java Architecture for XML Binding)是J2SE和J2EE平臺(tái)的一部分,能夠快速完成Java類和XML的互相映射。因此想要在SpringBoot中使用JAXB的話,是非常容易進(jìn)行集成的。
三、JAXB實(shí)現(xiàn)轉(zhuǎn)換
本節(jié)將重點(diǎn)介紹如何使用JAXB來(lái)實(shí)現(xiàn)XML向JSON的轉(zhuǎn)換。本小節(jié)依然從兩個(gè)比較重要的方面進(jìn)行介紹,首先依然是詳細(xì)介紹如何進(jìn)行實(shí)現(xiàn),其次是展示轉(zhuǎn)換過(guò)后的JSON數(shù)據(jù)。
1、詳細(xì)實(shí)現(xiàn)過(guò)程
由于JAXB是JDK默認(rèn)的一種實(shí)現(xiàn),因此在我們的工程中無(wú)需刻意的引入,直接在代碼中使用相關(guān)的類即可。為了將XML中的每個(gè)屬性和子元素都有對(duì)應(yīng)的對(duì)象和屬性來(lái)進(jìn)行綁定。我們將根據(jù)XML的層級(jí)和屬性定義來(lái)分別創(chuàng)建不同的對(duì)象。
首先來(lái)定義一個(gè)天地圖的返回結(jié)果對(duì)象,代碼如下所示:
package com.yelang.project.education.domain.tdt; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import lombok.Data; @XmlRootElement(name = "result") @Data @XmlAccessorType(XmlAccessType.FIELD) public class TdtResult { @XmlAttribute(name = "orig") private String orig; @XmlAttribute(name = "mid") private String mid; @XmlAttribute(name = "dest") private String dest; @XmlElement(name = "parameters") private TdtParameters parameters; @XmlElement(name = "routes") private TdtRoutes routes; @XmlElement(name = "simple") private TdtSimple simple; @XmlElement(name = "distance") private String distance; @XmlElement(name = "duration") private String duration; @XmlElement(name = "routelatlon") private String routelatlon; @XmlElement(name = "mapinfo") private TdtMapInfo mapinfo; // Getters 和 Setters }
接著來(lái)定義天地圖的參數(shù)對(duì)象,代碼如下所示:
package com.yelang.project.education.domain.tdt; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import lombok.Data; @XmlAccessorType(XmlAccessType.FIELD) @Data public class TdtParameters { @XmlElement(name = "orig") private String orig; @XmlElement(name = "dest") private String dest; @XmlElement(name = "mid") private String mid; @XmlElement(name = "key") private String key; @XmlElement(name = "width") private int width; @XmlElement(name = "height") private int height; @XmlElement(name = "style") private int style; @XmlElement(name = "version") private String version; @XmlElement(name = "sort") private String sort; // Getters 和 Setters }
然后是完整的路徑規(guī)劃信息,這里需要有一個(gè)對(duì)象的子項(xiàng)對(duì)象類接收信息,代碼如下:
package com.yelang.project.education.domain.tdt; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import lombok.Data; @XmlAccessorType(XmlAccessType.FIELD) @Data public class TdtRoutes { @XmlAttribute(name = "count") private int count; @XmlAttribute(name = "time") private String time; @XmlElement(name = "item") private List<TdtRoutesItem> items; }
package com.yelang.project.education.domain.tdt; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import lombok.Data; @XmlAccessorType(XmlAccessType.FIELD) @Data public class TdtRoutesItem { @XmlAttribute(name = "id") private String id; @XmlElement(name = "strguide") private String strguide; @XmlElement(name = "signage") private String signage; @XmlElement(name = "streetName") private String streetName; @XmlElement(name = "nextStreetName") private String nextStreetName; @XmlElement(name = "tollStatus") private int tollStatus; @XmlElement(name = "turnlatlon") private String turnlatlon; // Getters 和 Setters }
于此相同的是要在程序定義簡(jiǎn)單規(guī)劃對(duì)象信息。這里不進(jìn)行贅述。 當(dāng)我們把按照映射關(guān)系創(chuàng)建好以上的映射對(duì)象后。就可以實(shí)現(xiàn)將xml數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù)。來(lái)看一下具體的處理邏輯:
@Test public void xml2JavaBean() { String origInfo = "113.216171,28.190967";//黃花國(guó)際機(jī)場(chǎng) String destInfo = "112.957124,28.198626";//橘子洲景區(qū) // style 默認(rèn)0 (0:最快路線,1:最短路線,2:避開(kāi)高速,3:步行) // 這里選擇避開(kāi)高速 String postStr = "%7B'orig':'" + origInfo + "','dest':'" + destInfo + "','style':'2'%7D" ; HttpResponse<String> resp = tdtOptService.drivePlan(postStr,"search",TDT_SERVER_KEY); try { System.out.println(resp.getBodyResult()); JAXBContext context = JAXBContext.newInstance(TdtResult.class); Unmarshaller unmarshaller = context.createUnmarshaller(); TdtResult result = (TdtResult) unmarshaller.unmarshal(new StringReader(resp.getBodyResult())); System.out.println("距離: " + result.getDistance()); System.out.println("時(shí)長(zhǎng): " + result.getDuration()); System.out.println("起始點(diǎn): " + result.getParameters().getOrig()); // 輸出其他需要的數(shù)據(jù)... Gson gson = new Gson(); System.out.println("json格式化如下:"); System.out.println(gson.toJson(result)); System.out.println(result); } catch (JAXBException e) { e.printStackTrace(); } }
請(qǐng)注意,在上述的代碼中,我們首先創(chuàng)建了一個(gè)JAXBContext上下文對(duì)象,然后使用這個(gè)上下文對(duì)象創(chuàng)建Unmarshaller,最終進(jìn)行xml向JSON的轉(zhuǎn)換。
2、實(shí)現(xiàn)成果
經(jīng)過(guò)上面的開(kāi)發(fā)和轉(zhuǎn)換,我們就可以將天地圖獲取的XML數(shù)據(jù)轉(zhuǎn)換成JSON,交作業(yè)的時(shí)候到了。一起來(lái)看一下轉(zhuǎn)換的結(jié)果和最終格式化之后的效果吧。
接下來(lái)對(duì)比一下xml格式的數(shù)據(jù)和json格式的數(shù)據(jù)有什么不同沒(méi)有,比如參數(shù)的映射有問(wèn)題的,從其內(nèi)容和具體的轉(zhuǎn)換指標(biāo)的對(duì)比上來(lái)看下圖:
可以清楚的看到,經(jīng)過(guò)上面的轉(zhuǎn)換,基本已經(jīng)實(shí)現(xiàn)了將XML數(shù)據(jù)轉(zhuǎn)為JSON。
四、總結(jié)
本文即在這樣的背景下產(chǎn)生,博文首先對(duì)天地圖返回的XML信息元素進(jìn)行詳細(xì)的介紹,包括其主要的子元素等方面,然后介紹在SpringBoot中使用JAXB實(shí)現(xiàn)對(duì)路徑規(guī)劃的對(duì)應(yīng)的一一映射配置,最后完整的實(shí)現(xiàn)將天地圖的路徑規(guī)劃的XML數(shù)據(jù)轉(zhuǎn)為JSON格式。如果您當(dāng)前也有業(yè)務(wù)是基于天地圖來(lái)構(gòu)建,如果在構(gòu)建相關(guān)服務(wù)的過(guò)程中也有需要將XML進(jìn)行對(duì)應(yīng)的處理,不妨來(lái)這里看看。
以上就是SpringBoot基于JAXB實(shí)現(xiàn)天地圖路徑規(guī)劃結(jié)果XML轉(zhuǎn)JSON的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot XML轉(zhuǎn)JSON的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringMVC框架使用jackson封裝數(shù)據(jù)過(guò)程中遇到的問(wèn)題及解決
這篇文章主要介紹了SpringMVC框架使用jackson封裝數(shù)據(jù)過(guò)程中遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07使用httpclient實(shí)現(xiàn)免費(fèi)的google翻譯api
這篇文章主要介紹了使用httpclient實(shí)現(xiàn)免費(fèi)的google翻譯api的方法,大家參考使用吧2014-01-01Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè))
這篇文章主要介紹了Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java調(diào)用打印機(jī)的2種方式舉例(無(wú)驅(qū)/有驅(qū))
我們平時(shí)使用某些軟件或者在超市購(gòu)物的時(shí)候都會(huì)發(fā)現(xiàn)可以使用打印機(jī)進(jìn)行打印,這篇文章主要給大家介紹了關(guān)于Java調(diào)用打印機(jī)的2種方式,分別是無(wú)驅(qū)/有驅(qū)的相關(guān)資料,需要的朋友可以參考下2023-11-11集成apollo動(dòng)態(tài)日志取締logback-spring.xml配置
這篇文章主要為大家介紹了集成apollo動(dòng)態(tài)日志取締logback-spring.xml配置的過(guò)程內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02關(guān)于web項(xiàng)目讀取classpath下面文件的心得分享
這篇文章主要介紹了關(guān)于web項(xiàng)目讀取classpath下面文件的心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java?stream?sorted使用?Comparator?進(jìn)行多字段排序的方法
這篇文章主要介紹了Java?stream?sorted使用?Comparator?進(jìn)行多字段排序,主要講解使用Java?Stream流排序器Comparator對(duì)List集合進(jìn)行多字段排序的方法,包括復(fù)雜實(shí)體對(duì)象多字段升降序排序方法,需要的朋友可以參考下2023-03-03Java線程的創(chuàng)建介紹及實(shí)現(xiàn)方式示例
這篇文章主要為大家介紹了Java線程的創(chuàng)建介紹及實(shí)現(xiàn)方式示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09SpringBoot Maven打包失敗報(bào):class lombok.javac.apt.Lombo
最新項(xiàng)目部署的時(shí)候,出現(xiàn)了一個(gè)maven打包失敗的問(wèn)題,報(bào):class lombok.javac.apt.LombokProcessor錯(cuò)誤,所以本文給大家介紹了如何解決SpringBoot Maven 打包失敗:class lombok.javac.apt.LombokProcessor 錯(cuò)誤,需要的朋友可以參考下2023-12-12