一种快速简洁解析JSON数据接口的方法

眉间皱痕 提交于 2020-03-07 20:08:28

    Jackson提供了两种不同的JSON解析器:
        (1)ObjectMapper:把JSON解析到自定义的Java类中,或者解析到一个Jackson指定的树形结构中;
        (2)Jackson JsonParser:一种“拉式”解析器,每次解析一组JSON数据。

    本文介绍第一种方法:使用 ObjectMapper。

 

一.使用前准备

    Jackson包含一个core jar,和两个依赖core jar的jar,如图:

                               

    其中:Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。

把上面三个jar包添加到项目中。

 

二.使用示例

    调用阿里云一个查询城市经纬度信息的接口为例。首先要知道解析接口返回JSON数据的格式:

{"lon":121.4737,"level":1,"address":"","cityName":"上海市","alevel":4,"lat":31.23041}

    (1)根据JSON格式,准备对应的实体类,存储解析后的JSON数据:CityGeoEntity.java

    使用@JsonProperty("xxx")注解表示,实体类中某个成员变量对应Json串中某个字段,成员变量名可以不与Json串中属性同名,但一定要保证 @JsonProperty("xxx") 中的名称与Json串能够一一对应

import com.fasterxml.jackson.annotation.JsonProperty;
public class CityGeoEntity {

	private String longitude;
	private String latitude;
	private String level;
	private String alevel;
	private String address;
	private String cityName;
	
	@JsonProperty("level")
	public String getLevel() {
		return level;
	}
	@JsonProperty("level")
	public void setLevel(String level) {
		this.level = level;
	}
	@JsonProperty("lon")
	public String getLongitude() {
		return longitude;
	}
	@JsonProperty("lon")
	public void setLongitude(String longitude) {
		this.longitude = longitude;
	}
	@JsonProperty("lat")
	public String getLatitude() {
		return latitude;
	}
	@JsonProperty("lat")
	public void setLatitude(String latitude) {
		this.latitude = latitude;
	}
	@JsonProperty("alevel")
	public String getAlevel() {
		return alevel;
	}
	@JsonProperty("alevel")
	public void setAlevel(String alevel) {
		this.alevel = alevel;
	}
	@JsonProperty("address")
	public String getAddress() {
		return address;
	}
	@JsonProperty("address")
	public void setAddress(String address) {
		this.address = address;
	}
	@JsonProperty("cityName")
	public String getCityName() {
		return cityName;
	}
	@JsonProperty("cityName")
	public void setCityName(String cityName) {
		this.cityName = cityName;
	}
	@Override
	public String toString() {
		return "CityGeoEntity [longitude=" + longitude + ", latitude=" + latitude + "]";
	}
}

    (2)使用ObjectMapper解析Json数据,保存至实体类中,后续可以自己持久化到数据库中。

String surl="http://gc.ditu.aliyun.com/geocoding?a=上海市";
URL url=new URL(surl);
HttpURLConnection http=(HttpURLConnection)url.openConnection();
http.connect();
int rc=http.getResponseCode();
if(rc!=HttpURLConnection.HTTP_OK) 
	throw new IOException("Http error: "+rc);
InputStream is=http.getInputStream();

CityGeoEntity cityEntity = new ObjectMapper().readValue(is,CityGeoEntity.class);
System.out.println(cityName+" : " + cityEntity);

    测试结果:

上海市 : CityGeoEntity [longitude=121.4737, latitude=31.23041]

 

三.总结

    Jackson是一种JSON API,也是最流行,速度最快的JSON API。使用ObjectMapper解析JSON接口数据,能够快速简洁完成接口任务,JSON对象操作都在Jackson内部完成。

    上面是简单的封装调用,ObjectMapper也支持复杂结构的Json字符串(数组),使用分治的思想,找到每个基本的JSON结构,封装为Entity对象,内部结构作为外部结构的成员变量,直至解析到最外层。

    使用的这种方法解析接口在生产环境验证过。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!