欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot基于JAXB實(shí)現(xiàn)天地圖路徑規(guī)劃結(jié)果XML轉(zhuǎn)JSON

 更新時(shí)間:2025年02月28日 10:15:19   作者:夜郎king  
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何基于JAXB實(shí)現(xiàn)將天地圖路徑規(guī)劃結(jié)果XML轉(zhuǎn)JSON功能,文中的示例代碼講解詳細(xì),需要的可以了解下

前言

在之前的博文中在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)文章

最新評(píng)論