Json注解和动态Bean
Json annotations and dynamic beans
JSON String有时包含许多属性。创建一个包含所有的属性的POJO有时候很浪费。如果可以从一个Map里读取所有的属性不是很好嘛?Jackson 提供了注解来实现这样的目标。在下面的栗子里我们将两个属性设置在Bean里,其余属性将被读入Map里。这个栗子也介绍了一些Jackson里常用的注解。让我们先简单了解一下:
- @JsonProperty:这个注解用于标志一个属性的getter或者setter方法。换句话说,它将一个json的字段和一个java 属性相关联,如果为它指定一个名字的话。(@JsonProperty(“age”)那么被注解的java属性将被映射入json的age字段。如果不指定name,那么将使用java属性的名字);
- JsonCreator:这个注解用于定义通过JSON字符串创建Java对象时所使用的构造器。在数据绑定以及指定反序列化过程中所使用的属性时使用。
- @JsonAnyGetter 和@JsonAnySetter:这个注解用于标记读取或者设置没有被任何其他Java属性处理的字段的方法。它们的作用类似于“捕捉所有”并处理任何其他java属性不处理的所有字段。这些字段按照键值对存储在map里。
数据绑定栗子
public static void main(String[] args) throws IOException {
// String url = "http://freemusicarchive.org/api/get/albums.json?api_key=60BLHNQCAOUFPIBZ&limit=2";//译者注:原文里的url访问不了,这里自己构造了一些数据
String content="{\n" +
" \"title\" : \"作者提供的URL访问不了\",\n" +
" \"dataset\" : [ {\n" +
" \"album_id\" : \"1\",\n" +
" \"album_title\" : \"关注一下公众号嘛~\",\n" +
" \"支付宝账号\" : \"wethinker_xiaomo@126.com\",\n" +
" \"公众号名字\" : \"落花流水存心阁\"\n" +
" }, {\n" +
" \"album_id\" : \"1\",\n" +
" \"album_title\" : \"关注一下公众号嘛~\",\n" +
" \"支付宝账号\" : \"wethinker_xiaomo@126.com\",\n" +
" \"公众号名字\" : \"落花流水存心阁\"\n" +
" } ]\n" +
"}";
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
AlbumsDynamic albums = mapper.readValue(content, AlbumsDynamic.class);
DatasetDynamic[] datasets = albums.getDataset();
for (DatasetDynamic dataset : datasets) {
System.out.println(dataset.get("公众号名字"));
}
// 构建数据
// AlbumsDynamic albumsDynamic=new AlbumsDynamic();
// albumsDynamic.setTitle("作者提供的URL访问不了");
// DatasetDynamic datasetDynamic=new DatasetDynamic("1","关注一下公众号嘛~");
// datasetDynamic.set("公众号名字","落花流水存心阁");
// datasetDynamic.set("支付宝账号","wethinker_xiaomo@126.com");
//
// DatasetDynamic datasetDynamic1=new DatasetDynamic("1","关注一下公众号嘛~");
// datasetDynamic1.set("公众号名字","落花流水存心阁");
// datasetDynamic1.set("支付宝账号","wethinker_xiaomo@126.com");
//
// DatasetDynamic[] datasetDynamics=new DatasetDynamic[2];
// datasetDynamics[0]=datasetDynamic;
// datasetDynamics[1]=datasetDynamic1;
//
// albumsDynamic.setDataset(datasetDynamics);
//
// ObjectMapper mapper=new ObjectMapper();
// mapper.writerWithDefaultPrettyPrinter().writeValue(System.out,albumsDynamic);
}
public class DatasetDynamic {
private String album_id;
private String album_title;
private Map<String , Object> otherProperties = new HashMap<String,Object>();
@JsonCreator
public DatasetDynamic(@JsonProperty("album_id") String album_id, @JsonProperty("album_title") String album_title) {
this.album_id = album_id;
this.album_title = album_title;
}
public String getAlbum_id() {
return album_id;
}
public void setAlbum_id(String album_id) {
this.album_id = album_id;
}
public String getAlbum_title() {
return album_title;
}
public void setAlbum_title(String album_title) {
this.album_title = album_title;
}
public Object get(String name) {
return otherProperties.get(name);
}
@JsonAnyGetter
public Map<String , Object> any() {
return otherProperties;
}
@JsonAnySetter
public void set(String name, Object value) {
otherProperties.put(name, value);
}
}
public class AlbumsDynamic {
private String title;
private DatasetDynamic[] dataset;
public void setTitle(String title) {
this.title = title;
}
public void setDataset(DatasetDynamic[] dataset) {
this.dataset = dataset;
}
public String getTitle() {
return title;
}
public DatasetDynamic[] getDataset() {
return dataset;
}
}