Json data binding filters

Jackson提供了一个高效的方法将json和Java POJOs对象绑定起来。然而,有时,在将json转换成Java对象或是将Java对象转成json时,我们并不需要POJOs中的所有属性,而是想忽略其中某些属性。Jackson提供了三种方式来过滤属性。

  1. @JsonIgnoreProperties —— 这个注解作用在类上来忽略json属性。在下面的example中,我们忽视albums中dataset的tags属性。
  2. @JsonIgnore —— 这个注解作用在属性上来忽视某些属性。
  3. 出来上面的注解方式,你还可以自定义过滤方式。

下面的example演示了方法1和方法2的用法。注意@JsonAutoDetect注解的使用。

Data Binding Filters 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 DataBindingFilter {
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         AlbumsFilter albums = mapper.readValue(new URL(url), AlbumsFilter.class);
16         System.out.println(albums.getTotal_pages());
17         System.out.println(albums.getTitle());
18         for (DatasetFilter dataset : albums.getDatasetFilter()) {
19             System.out.println(dataset.getAlbum_comments());
20             System.out.println(dataset.get("album_images"));
21             System.out.println(dataset.get("tags"));
22             System.out.println(dataset.get("album_listens"));
23             break;
24         }
25     }
26  
27 }

The AlbumsFilter class

 1 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 2 import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
 3 import com.fasterxml.jackson.annotation.JsonProperty;
 4  
 5 // Do not use fields to autodetect. use the public getter methods to autodetect properties
 6 @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.PUBLIC_ONLY)
 7 public class AlbumsFilter {
 8  
 9     private String title;
10     private DatasetFilter[] datasetFilter;
11     public String total_pages;
12  
13     protected String getTotal_pages() {
14         return total_pages;
15     }
16  
17     public String getTitle() {
18         return title;
19     }
20  
21     // this getter method is for the 'dataset' property
22     @JsonProperty("dataset")
23     public DatasetFilter[] getDatasetFilter() {
24         return datasetFilter;
25     }
26 }

DatasetFilter class

 1 import java.util.HashMap;
 2 import java.util.Map;
 3  
 4 import com.fasterxml.jackson.annotation.JsonAnyGetter;
 5 import com.fasterxml.jackson.annotation.JsonAnySetter;
 6 import com.fasterxml.jackson.annotation.JsonCreator;
 7 import com.fasterxml.jackson.annotation.JsonIgnore;
 8 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 9 import com.fasterxml.jackson.annotation.JsonProperty;
10  
11 // ignore the property with name 'tags'.
12 @JsonIgnoreProperties({ "tags" })
13 public class DatasetFilter {
14     private String album_id;
15     private String album_title;
16     private Map<String , Object> otherProperties = new HashMap<String , Object>();
17     private String album_comments;
18  
19     @JsonCreator
20     public DatasetFilter(@JsonProperty("album_id") String album_id, @JsonProperty("album_title") String album_title) {
21         this.album_id = album_id;
22         this.album_title = album_title;
23     }
24  
25     // ignore the property specified by this getter.
26     @JsonIgnore
27     public String getAlbum_comments() {
28         return album_comments;
29     }
30  
31     public String getAlbum_id() {
32         return album_id;
33     }
34  
35     public void setAlbum_id(String album_id) {
36         this.album_id = album_id;
37     }
38  
39     public String getAlbum_title() {
40         return album_title;
41     }
42  
43     public void setAlbum_title(String album_title) {
44         this.album_title = album_title;
45     }
46  
47     public Object get(String name) {
48         return otherProperties.get(name);
49     }
50  
51     // this method is used to get all properties not specified earlier.
52     @JsonAnyGetter
53     public Map<String , Object> any() {
54         return otherProperties;
55     }
56  
57     @JsonAnySetter
58     public void set(String name, Object value) {
59         otherProperties.put(name, value);
60     }
61 }