SpringBoot基于JAXB實現天地圖路徑規(guī)劃結果XML轉JSON
前言
在之前的博文中在SpringBoot中使用UniHttp簡化天地圖路徑規(guī)劃調用實踐。在這篇文章中,我們實現了在SpringBoot中調用天地圖的Web接口調用,從而獲取相應駕車的路徑規(guī)劃信息。雖然整體的流程已經走通了,但是在天地圖的路徑規(guī)劃接口的響應參數中,返回的數據格式是xml的。雖然xml也可以作為一種標準的接口傳輸數據類型,但是現代的接口調用中,通常返回的數據類型基本是以JSON為主。為了讓接口更加具有通用性,可以對接更多的第三方接口,為別的業(yè)務平臺提供更好的服務。將天地圖返回的XML轉換為標準的JSON數據也就非常有必要。

本文即在這樣的背景下產生,博文首先對天地圖返回的XML信息元素進行詳細的介紹,包括其主要的子元素等方面,然后介紹在SpringBoot中使用JAXB實現對路徑規(guī)劃的對應的一一映射配置,最后完整的實現將天地圖的路徑規(guī)劃的XML數據轉為JSON格式。如果您當前也有業(yè)務是基于天地圖來構建,如果在構建相關服務的過程中也有需要將XML進行對應的處理,不妨來這里看看。
一、路徑規(guī)劃返回參數簡介
本節(jié)將對基于天地圖的路徑規(guī)劃服務接口中的返回參數進行詳細介紹。尤其是對其返回的XML返回參數的格式以及攜帶的子參數進行重點介紹。這將是文章的重點內容對如何構建對應的對象信息至關重要,請務必掌握這里的知識。這里分兩個部分來進行,首先是對返回的XML對象進行梳理,對齊包含的屬性和子元素信息進行介紹,最后是一個實例的介紹。
1、返回xml梳理
首先還是從官網入手,先來看一下天地圖的返回參數的介紹,天地圖駕車路徑規(guī)劃API地址,在瀏覽器中輸入以上的地址后,可以在其網站上看到以下的返回參數信息:

完整的XML響應內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<result orig='起點經緯度' mid='途徑點信息' dest='終點經緯度'>
<parameters>
<orig>起點加密經緯度</orig>
<dest>終點加密經緯度</dest>
<mid>途徑點加密經緯度集合</mid>
<key>經緯度加密的 key 值</key>
<width>地圖寬度</width>
<height>地圖高度</height>
<style>導航路線類型</style>
<version>版本控制</version>
<sort>排序方式</sort>
</parameters>
<routes count='分段總數' time='查詢時間'>
<item id='0'>
<strguide>每段線路文字描述</strguide>
<signage>“路牌”引導提示/高速路收費站出口信息</signage>
<streetName>當前路段名稱</streetName>
<nextStreetName>下一段道路名稱</nextStreetName>
<tollStatus>道路收費信息(0=免費路段,1=收費路段,2=部分收費路段)</tollStatus>
<turnlatlon>轉折點經緯度</turnlatlon>
</item>
<item id='1'>
....
</item>
....其他分段線路信息
</routes>
<simple>
<item id='0'>
<strguide>每段線路文字描述</strguide>
<streetNames>當前行駛路段名稱(含多個路段)</streetNames>
<lastStreetName>最后一段道路名稱</lastStreetName>
<linkStreetName>合并段之間銜接的道路名稱</linkStreetName>
<signage>“路牌”引導提示/高速路收費站出口信息</signage>
<tollStatus>道路收費信息(0=免費路段,1=收費路段,2=部分收費路段)</tollStatus>
<turnlatlon>轉折點經緯度</turnlatlon>
<streetLatLon>線路經緯度</streetLatLon>
<streetDistance>行駛總距離(單位:米)</streetDistance>
<segmentNumber>合并后的號段,對應詳細描述中的號段</segmentNumber>
</item>
<item id='1'>
....
</item>
....其他分段線路信息
</simple>
<distance>全長(單位:公里)</distance>
<duration>行駛總時間(單位:秒)</duration>
<routelatlon>線路經緯度字符串</routelatlon>
<mapinfo>
<center>全部結果同時顯示的適宜中心經緯度</center>
<scale>全部結果同時顯示的適宜縮放比例</scale>
</mapinfo>
</result>
從以上的思維導圖中可以看到,天地圖的路徑規(guī)劃接口返回的XML類型的數據中,其主要包含了這7類數據,1是請求的參數信息,2是 完整的路徑規(guī)劃信息,3是簡化的路徑規(guī)劃信息,但是路徑規(guī)劃的詳細內容會稍微多一點,4是導航全程的距離,5是行駛的總時間,6是路線經緯度字符串,7是地圖展示信息。
2、返回xml實例
下面依然以從長沙黃花機場到橘子洲的路徑規(guī)劃結果來對返回參數進行綜合介紹。為了減少對篇幅的占用,這里我展示的是簡單樣例部分的數據。如下圖所示:

按照前面內容展示信息,我們以簡化后的路徑規(guī)劃內容為例進行展示,可以看到全程路程大約31.13公里,行駛距離大約是2667.0秒,等于 44.5分鐘。在城區(qū)中形式,這個速度應該是差不多的。從黃花機場到橘子洲的大約形式路線如下:
先從起始點出發(fā),進入遠大一路/國道107,距離大約101米,然后沿遠大一路/國道107,遠大二路/省道103,車站中路/國道107,遠大三路/省道103,省道103,五一大道/國道107,機場大道行駛,進入橘洲路,這里行駛的距離大約是30771米,最后是沿橘洲路行駛到目的地,大約262米的樣子。
二、JAXB技術介紹
本節(jié)將重點介紹JAXB的相關技術,主要從以下兩個方面進行介紹。第一JAXB是什么?其次是JAXB能做什么?
1、JAXB是什么
JAXB(Java Architecture for XML Binding)是一種Java技術,它允許Java開發(fā)人員將Java對象映射為XML表示方式,并支持將XML實例文檔轉換為Java對象。 JAXB的主要功能包括將Java對象序列化為XML文檔,以及將XML文檔解析為Java對象。這使得開發(fā)者可以方便地在Java應用程序中處理XML數據,而不需要編寫特定的XML解析代碼。
JAXB通過使用注解來定義Java類與XML文檔之間的映射關系。常用的注解包括@XmlRootElement、@XmlElement等,這些注解幫助開發(fā)者指定如何將Java對象轉換為XML格式,以及如何從XML格式解析數據。
2、JAXB能做什么
JAXB的應用場景
Web服務:在Web服務中,JAXB可以將Java對象序列化為XML文檔,以便在不同系統(tǒng)之間進行數據交換。XML文件讀寫:在讀寫XML文件時,JAXB可以將XML文檔轉換為Java對象,以便進行操作和處理。SOAP消息處理:在SOAP(Simple Object Access Protocol)消息處理中,JAXB可以用于將Java對象轉換為SOAP消息,或將SOAP消息轉換為Java對象。
JAXB是JDK 1.8中自帶的類。JAXB(Java Architecture for XML Binding)是J2SE和J2EE平臺的一部分,能夠快速完成Java類和XML的互相映射。因此想要在SpringBoot中使用JAXB的話,是非常容易進行集成的。
三、JAXB實現轉換
本節(jié)將重點介紹如何使用JAXB來實現XML向JSON的轉換。本小節(jié)依然從兩個比較重要的方面進行介紹,首先依然是詳細介紹如何進行實現,其次是展示轉換過后的JSON數據。
1、詳細實現過程
由于JAXB是JDK默認的一種實現,因此在我們的工程中無需刻意的引入,直接在代碼中使用相關的類即可。為了將XML中的每個屬性和子元素都有對應的對象和屬性來進行綁定。我們將根據XML的層級和屬性定義來分別創(chuàng)建不同的對象。
首先來定義一個天地圖的返回結果對象,代碼如下所示:
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
}接著來定義天地圖的參數對象,代碼如下所示:
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ī)劃信息,這里需要有一個對象的子項對象類接收信息,代碼如下:
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
}于此相同的是要在程序定義簡單規(guī)劃對象信息。這里不進行贅述。 當我們把按照映射關系創(chuàng)建好以上的映射對象后。就可以實現將xml數據轉換成json數據。來看一下具體的處理邏輯:
@Test
public void xml2JavaBean() {
String origInfo = "113.216171,28.190967";//黃花國際機場
String destInfo = "112.957124,28.198626";//橘子洲景區(qū)
// style 默認0 (0:最快路線,1:最短路線,2:避開高速,3:步行)
// 這里選擇避開高速
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("時長: " + result.getDuration());
System.out.println("起始點: " + result.getParameters().getOrig());
// 輸出其他需要的數據...
Gson gson = new Gson();
System.out.println("json格式化如下:");
System.out.println(gson.toJson(result));
System.out.println(result);
} catch (JAXBException e) {
e.printStackTrace();
}
}請注意,在上述的代碼中,我們首先創(chuàng)建了一個JAXBContext上下文對象,然后使用這個上下文對象創(chuàng)建Unmarshaller,最終進行xml向JSON的轉換。
2、實現成果
經過上面的開發(fā)和轉換,我們就可以將天地圖獲取的XML數據轉換成JSON,交作業(yè)的時候到了。一起來看一下轉換的結果和最終格式化之后的效果吧。

接下來對比一下xml格式的數據和json格式的數據有什么不同沒有,比如參數的映射有問題的,從其內容和具體的轉換指標的對比上來看下圖:

可以清楚的看到,經過上面的轉換,基本已經實現了將XML數據轉為JSON。
四、總結
本文即在這樣的背景下產生,博文首先對天地圖返回的XML信息元素進行詳細的介紹,包括其主要的子元素等方面,然后介紹在SpringBoot中使用JAXB實現對路徑規(guī)劃的對應的一一映射配置,最后完整的實現將天地圖的路徑規(guī)劃的XML數據轉為JSON格式。如果您當前也有業(yè)務是基于天地圖來構建,如果在構建相關服務的過程中也有需要將XML進行對應的處理,不妨來這里看看。
以上就是SpringBoot基于JAXB實現天地圖路徑規(guī)劃結果XML轉JSON的詳細內容,更多關于SpringBoot XML轉JSON的資料請關注腳本之家其它相關文章!
相關文章
SpringMVC框架使用jackson封裝數據過程中遇到的問題及解決
這篇文章主要介紹了SpringMVC框架使用jackson封裝數據過程中遇到的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Spring?Data?Jpa?復雜查詢方式總結(多表關聯及自定義分頁)
這篇文章主要介紹了Spring?Data?Jpa?復雜查詢方式總結(多表關聯及自定義分頁),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
集成apollo動態(tài)日志取締logback-spring.xml配置
這篇文章主要為大家介紹了集成apollo動態(tài)日志取締logback-spring.xml配置的過程內容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02
Java?stream?sorted使用?Comparator?進行多字段排序的方法
這篇文章主要介紹了Java?stream?sorted使用?Comparator?進行多字段排序,主要講解使用Java?Stream流排序器Comparator對List集合進行多字段排序的方法,包括復雜實體對象多字段升降序排序方法,需要的朋友可以參考下2023-03-03
SpringBoot Maven打包失敗報:class lombok.javac.apt.Lombo
最新項目部署的時候,出現了一個maven打包失敗的問題,報:class lombok.javac.apt.LombokProcessor錯誤,所以本文給大家介紹了如何解決SpringBoot Maven 打包失?。篶lass lombok.javac.apt.LombokProcessor 錯誤,需要的朋友可以參考下2023-12-12

