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對象,內部結構做爲外部結構的成員變量,直至解析到最外層。
使用的這種方法解析接口在生產環境驗證過。