让JSON字符串从一端进入,然后Java POJOs从另一端出,或者反过来,这就是Jackson Data Binding做的事。通过例子可以很好理解,我们从一个免费的music archive网站获取json。网站提供了一个API接口以json格式返回最新的albums列表(点击链接可查看返回的json)。我们将解析这个json字符串成一个Java对象。
下面是json转化成Java对象的步骤:
- 第一个是创建一个Java类来存储json数据。这可以通过查看 json做到。我们创建一个
Albums
对象来持有整个json数据。json包含dataset
元素的Array。我们创建一个DataSet
类型的Java对象,在Albums
对象中我们创建一个dataset
属性,它是一个DataSet
类型的Array。 - 创建一个
com.fasterxml.jackson.databind.ObjectMapper
类实例。这个类将json字符串map成Java对象。
1 com.fasterxml.jackson.databind.ObjectMapper
- 我们用
ObjectMapper
的readValue
方法来读取json。readValue
方法有多个版本,可以有多种类型的参数,例如从一个file
,inputstream
,String
或者一个ByteArray
中读取,还可以从网络中读取,也就是我们使用的传递URL作为参数的版本。 ObjectMapper
缓存序列化和反序列化器,以便多次转换可以重用一个ObjectMapper
实例。- 如果你给
readValue
传递的参数是一个InputStream
,处于性能考虑,不要用InputStreamReader
包裹InputStream
。
Data Binding Example
1 import java.io.IOException;
2 import java.net.MalformedURLException;
3 import java.net.URL;
4
5 import com.fasterxml.jackson.core.JsonParseException;
6 import com.fasterxml.jackson.databind.DeserializationFeature;
7 import com.fasterxml.jackson.databind.JsonMappingException;
8 import com.fasterxml.jackson.databind.ObjectMapper;
9
10 public class DataBinding1 {
11 public static void main(String[] args) throws JsonParseException, JsonMappingException, MalformedURLException, IOException {
12 String url = "http://freemusicarchive.org/api/get/albums.json?api_key=60BLHNQCAOUFPIBZ&limit=2";
13 ObjectMapper mapper = new ObjectMapper();
14 mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
15 Albums albums = mapper.readValue(new URL(url), Albums.class);
16 Dataset[] datasets = albums.getDataset();
17 for (Dataset dataset : datasets) {
18 System.out.println(dataset.getAlbum_title());
19 }
20 }
21
22 }
这里我们禁用了如果遇到未知属性,会引起mapper中断解析的特性。这样的话,如果json中有10个属性,而我们在Java Bean中仅仅定义了2个,那么其余的8个将被忽略。
The Albums class
1 public class Albums {
2
3 private String title;
4 private Dataset[] dataset;
5
6 public void setTitle(String title) {
7 this.title = title;
8 }
9
10 public void setDataset(Dataset[] dataset) {
11 this.dataset = dataset;
12 }
13
14 public String getTitle() {
15 return title;
16 }
17
18 public Dataset[] getDataset() {
19 return dataset;
20 }
21 }
Dataset class
1 import java.util.HashMap;
2 import java.util.Map;
3
4 public class Dataset {
5 private String album_id;
6 private String album_title;
7 private Map<String , Object> otherProperties = new HashMap<String , Object>();
8
9 public String getAlbum_id() {
10 return album_id;
11 }
12
13 public void setAlbum_id(String album_id) {
14 this.album_id = album_id;
15 }
16
17 public String getAlbum_title() {
18 return album_title;
19 }
20
21 public void setAlbum_title(String album_title) {
22 this.album_title = album_title;
23 }
24
25 public Object get(String name) {
26 return otherProperties.get(name);
27 }
28
29 }