Jackson Json注解和动态Bean

Json注解和动态Bean

Json annotations and dynamic beans

JSON String有时包含许多属性。创建一个包含所有的属性的POJO有时候很浪费。如果可以从一个Map里读取所有的属性不是很好嘛?Jackson 提供了注解来实现这样的目标。在下面的栗子里我们将两个属性设置在Bean里,其余属性将被读入Map里。这个栗子也介绍了一些Jackson里常用的注解。让我们先简单了解一下:

  1. @JsonProperty:这个注解用于标志一个属性的getter或者setter方法。换句话说,它将一个json的字段和一个java 属性相关联,如果为它指定一个名字的话。(@JsonProperty(“age”)那么被注解的java属性将被映射入json的age字段。如果不指定name,那么将使用java属性的名字);
  2. JsonCreator:这个注解用于定义通过JSON字符串创建Java对象时所使用的构造器。在数据绑定以及指定反序列化过程中所使用的属性时使用。
  3. @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;
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值