Jackson提供了两种不一样的JSON解析器:
(1)ObjectMapper:把JSON解析到自定义的Java类中,或者解析到一个Jackson指定的树形结构中;
(2)Jackson JsonParser:一种“拉式”解析器,每次解析一组JSON数据。java
本文介绍第一种方法:使用 ObjectMapper。git
Jackson包含一个core jar,和两个依赖core jar的jar,如图:数据库
其中:Jackson Annotations依赖Jackson Core,Jackson Databind依赖Jackson Annotations。json
把上面三个jar包添加到项目中。数组
调用阿里云一个查询城市经纬度信息的接口为例。首先要知道解析接口返回JSON数据的格式:app
{"lon":121.4737,"level":1,"address":"","cityName":"上海市","alevel":4,"lat":31.23041}
(1)根据JSON格式,准备对应的实体类,存储解析后的JSON数据:CityGeoEntity.javaide
使用@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数据,保存至实体类中,后续能够本身持久化到数据库中。this
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对象,内部结构做为外部结构的成员变量,直至解析到最外层。
使用的这种方法解析接口在生产环境验证过。