Jackson提供了一个高效的方法将json和Java POJOs对象绑定起来。然而,有时,在将json转换成Java对象或是将Java对象转成json时,我们并不需要POJOs中的所有属性,而是想忽略其中某些属性。Jackson提供了三种方式来过滤属性。
- @JsonIgnoreProperties —— 这个注解作用在类上来忽略json属性。在下面的example中,我们忽视albums中dataset的
tags
属性。 - @JsonIgnore —— 这个注解作用在属性上来忽视某些属性。
- 出来上面的注解方式,你还可以自定义过滤方式。
下面的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 }