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对象,内部结构作为外部结构的成员变量,直至解析到最外层。
使用的这种方法解析接口在生产环境验证过。
来源:oschina
链接:https://my.oschina.net/u/2862104/blog/1561158