Jackson - Data Binding

让JSON字符串从一端进入,然后Java POJOs从另一端出,或者反过来,这就是Jackson Data Binding做的事。通过例子可以很好理解,我们从一个免费的music archive网站获取json。网站提供了一个API接口以json格式返回最新的albums列表(点击链接可查看返回的json)。我们将解析这个json字符串成一个Java对象。

下面是json转化成Java对象的步骤:

  1. 第一个是创建一个Java类来存储json数据。这可以通过查看 json做到。我们创建一个Albums对象来持有整个json数据。json包含dataset元素的Array。我们创建一个DataSet类型的Java对象,在Albums对象中我们创建一个dataset属性,它是一个DataSet类型的Array。
  2. 创建一个com.fasterxml.jackson.databind.ObjectMapper类实例。这个类将json字符串map成Java对象。
1 com.fasterxml.jackson.databind.ObjectMapper
  1. 我们用ObjectMapperreadValue方法来读取json。readValue方法有多个版本,可以有多种类型的参数,例如从一个file,inputstreamString或者一个ByteArray中读取,还可以从网络中读取,也就是我们使用的传递URL作为参数的版本。
  2. ObjectMapper缓存序列化和反序列化器,以便多次转换可以重用一个ObjectMapper实例。
  3. 如果你给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 }