目录
前言
在之前的博文中在SpringBoot中使用UniHttp简化天地图路径规划调用实践。在这篇文章中,我们实现了在SpringBoot中调用天地图的Web接口调用,从而获取相应驾车的路径规划信息。虽然整体的流程已经走通了,但是在天地图的路径规划接口的响应参数中,返回的数据格式是xml的。虽然xml也可以作为一种标准的接口传输数据类型,但是现代的接口调用中,通常返回的数据类型基本是以JSON为主。为了让接口更加具有通用性,可以对接更多的第三方接口,为别的业务平台提供更好的服务。将天地图返回的XML转换为标准的JSON数据也就非常有必要。
本文即在这样的背景下产生,博文首先对天地图返回的XML信息元素进行详细的介绍,包括其主要的子元素等方面,然后介绍在SpringBoot中使用JAXB实现对路径规划的对应的一一映射配置,最后完整的实现将天地图的路径规划的XML数据转为JSON格式。如果您当前也有业务是基于天地图来构建,如果在构建相关服务的过程中也有需要将XML进行对应的处理,不妨来这里看看。
一、路径规划返回参数简介
本节将对基于天地图的路径规划服务接口中的返回参数进行详细介绍。尤其是对其返回的XML返回参数的格式以及携带的子参数进行重点介绍。这将是文章的重点内容对如何构建对应的对象信息至关重要,请务必掌握这里的知识。这里分两个部分来进行,首先是对返回的XML对象进行梳理,对齐包含的属性和子元素信息进行介绍,最后是一个实例的介绍。
1、返回xml梳理
首先还是从官网入手,先来看一下天地图的返回参数的介绍,天地图驾车路径规划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>
从以上的思维导图中可以看到,天地图的路径规划接口返回的XML类型的数据中,其主要包含了这7类数据,1是请求的参数信息,2是 完整的路径规划信息,3是简化的路径规划信息,但是路径规划的详细内容会稍微多一点,4是导航全程的距离,5是行驶的总时间,6是路线经纬度字符串,7是地图展示信息。
2、返回xml实例
下面依然以从长沙黄花机场到橘子洲的路径规划结果来对返回参数进行综合介绍。为了减少对篇幅的占用,这里我展示的是简单样例部分的数据。如下图所示:
按照前面内容展示信息,我们以简化后的路径规划内容为例进行展示,可以看到全程路程大约31.13公里,行驶距离大约是2667.0秒,等于 44.5分钟。在城区中形式,这个速度应该是差不多的。从黄花机场到橘子洲的大约形式路线如下:
先从起始点出发,进入远大一路/国道107,距离大约101米,然后沿远大一路/国道107,远大二路/省道103,车站中路/国道107,远大三路/省道103,省道103,五一大道/国道107,机场大道行驶,进入橘洲路,这里行驶的距离大约是30771米,最后是沿橘洲路行驶到目的地,大约262米的样子。
二、JAXB技术介绍
本节将重点介绍JAXB的相关技术,主要从以下两个方面进行介绍。第一JAXB是什么?其次是JAXB能做什么?
1、JAXB是什么
JAXB(Java Architecture for XML Binding)是一种Java技术,它允许Java开发人员将Java对象映射为XML表示方式,并支持将XML实例文档转换为Java对象。 JAXB的主要功能包括将Java对象序列化为XML文档,以及将XML文档解析为Java对象。这使得开发者可以方便地在Java应用程序中处理XML数据,而不需要编写特定的XML解析代码。
JAXB通过使用注解来定义Java类与XML文档之间的映射关系。常用的注解包括@XmlRootElement、@XmlElement等,这些注解帮助开发者指定如何将Java对象转换为XML格式,以及如何从XML格式解析数据。
2、JAXB能做什么
JAXB的应用场景
Web服务:在Web服务中,JAXB可以将Java对象序列化为XML文档,以便在不同系统之间进行数据交换。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实现转换
本节将重点介绍如何使用JAXB来实现XML向JSON的转换。本小节依然从两个比较重要的方面进行介绍,首先依然是详细介绍如何进行实现,其次是展示转换过后的JSON数据。
1、详细实现过程
由于JAXB是JDK默认的一种实现,因此在我们的工程中无需刻意的引入,直接在代码中使用相关的类即可。为了将XML中的每个属性和子元素都有对应的对象和属性来进行绑定。我们将根据XML的层级和属性定义来分别创建不同的对象。
首先来定义一个天地图的返回结果对象,代码如下所示:
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
}
然后是完整的路径规划信息,这里需要有一个对象的子项对象类接收信息,代码如下:
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
}
于此相同的是要在程序定义简单规划对象信息。这里不进行赘述。 当我们把按照映射关系创建好以上的映射对象后。就可以实现将xml数据转换成json数据。来看一下具体的处理逻辑:
@Test
public void xml2JavaBean() {
String origInfo = "113.216171,28.190967";//黄花国际机场
String destInfo = "112.957124,28.198626";//橘子洲景区
// 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();
}
}
请注意,在上述的代码中,我们首先创建了一个JAXBContext上下文对象,然后使用这个上下文对象创建Unmarshaller,最终进行xml向JSON的转换。
2、实现成果。
经过上面的开发和转换,我们就可以将天地图获取的XML数据转换成JSON,交作业的时候到了。一起来看一下转换的结果和最终格式化之后的效果吧。
接下来对比一下xml格式的数据和json格式的数据有什么不同没有,比如参数的映射有问题的,从其内容和具体的转换指标的对比上来看下图:
可以清楚的看到,经过上面的转换,基本已经实现了将XML数据转为JSON。
四、总结
以上就是本文的主要内容,本文即在这样的背景下产生,博文首先对天地图返回的XML信息元素进行详细的介绍,包括其主要的子元素等方面,然后介绍在SpringBoot中使用JAXB实现对路径规划的对应的一一映射配置,最后完整的实现将天地图的路径规划的XML数据转为JSON格式。如果您当前也有业务是基于天地图来构建,如果在构建相关服务的过程中也有需要将XML进行对应的处理,不妨来这里看看。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家朋友在评论区不吝指出,不才不胜感激。