概述
Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的JavaJson解析器”。
Jackson框架包含了3个核心库:streaming,databind,annotations.Jackson还包含了其它数据处理类库,此外不作说明。
Jackson版本: 1.x (目前版本从1.1~1.9)与2.x。1.x与2.x从包的命名上可以看出来,1.x的类库中,包命名以:org.codehaus.jackson.xxx开头,而2.x类库中包命令:com.fastxml.jackson.xxx开头
准备工作
本文所有程序都基于JDK1.7,依赖jackon的三个核心类库:
jackson-core-2.5.3.jar
jackson-annotations-2.5.3.jar
jackson-databind-2.5.3.jar
Jackson处理Json
Jackson提供了三种可选的Json处理方法:流式API(Streaming API) 、树模型(Tree Model)、数据绑定(Data Binding)。从使用角度来看,比较一下这三种处理Json的方式的特性:
Streaming API:是效率最高的处理方式(开销低、读写速度快,但程序编写复杂度高)
Tree Model:是最灵活的处理方式
Data Binding:是最常用的处理方式
下面我们通过例子程序分别使用DataBinding,TreeModel,Streaming的方式来创建和解析Json字符串
1.DataBinding处理Json
Jackson支持Java对象与Json之间的相互转化。java对象序列化为json字符串,json字符串也可以反序列化为相同的java对象。
(1)java对象转化成json:
Province.java
packagecom.jackson.json.databinding;
publicclassProvince {
publicString name;
publicintpopulation;
publicString[] city;
}
package com.jackson.json.databinding;
public class Province {
public String name;
public int population;
public String[] city;
}
Country.java
packagecom.jackson.json.databinding;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.Date;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
publicclassCountry {
// 注意:被序列化的bean的private属性字段需要创建getter方法或者属性字段应该为public
privateString country_id;
privateDate birthDate;
privateList nation =newArrayList();
privateString[] lakes;
privateList provinces =newArrayList();
privateMap traffic =newHashMap();
publicCountry() {
// TODO Auto-generated constructor stub
}
publicCountry(String countryId) {
this.country_id = countryId;
}
publicString getCountry_id() {
returncountry_id;
}
publicvoidsetCountry_id(String country_id) {
this.country_id = country_id;
}
publicDate getBirthDate() {
returnbirthDate;
}
publicvoidsetBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
publicList getNation() {
returnnation;
}
publicvoidsetNation(List nation) {
this.nation = nation;
}
publicString[] getLakes() {
returnlakes;
}
publicvoidsetLakes(String[] lakes) {
this.lakes = lakes;
}
publicInteger get(String key) {
returntraffic.get(key);
}
publicMap getTraffic() {
returntraffic;
}
publicvoidsetTraffic(Map traffic) {
this.traffic = traffic;
}
publicvoidaddTraffic(String key, Integer value) {
traffic.put(key, value);
}
publicList getProvinces() {
returnprovinces;
}
publicvoidsetProvinces(List provinces) {
this.provinces = provinces;
}
@Override
publicString toString() {
return“Country [country_id=”+ country_id +“, birthDate=”+ birthDate
+ ”, nation=”+ nation +“, lakes=”+ Arrays.toString(lakes)
+ ”, province=”+ provinces +“, traffic=”+ traffic +“]”;
}
}
package com.jackson.json.databinding;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Country {
// 注意:被序列化的bean的private属性字段需要创建getter方法或者属性字段应该为public
private String country_id;
private Date birthDate;
private List nation = new ArrayList();
private String[] lakes;
private List provinces = new ArrayList();
private Map traffic = new HashMap();
public Country() {
// TODO Auto-generated constructor stub
}
public Country(String countryId) {
this.country_id = countryId;
}
public String getCountry_id() {
return country_id;
}
public void setCountry_id(String country_id) {
this.country_id = country_id;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public List<String> getNation() {
return nation;
}
public void setNation(List<String> nation) {
this.nation = nation;
}
public String[] getLakes() {
return lakes;
}
public void setLakes(String[] lakes) {
this.lakes = lakes;
}
public Integer get(String key) {
return traffic.get(key);
}
public Map<String, Integer> getTraffic() {
return traffic;
}
public void setTraffic(Map<String, Integer> traffic) {
this.traffic = traffic;
}
public void addTraffic(String key, Integer value) {
traffic.put(key, value);
}
public List<Province> getProvinces() {
return provinces;
}
public void setProvinces(List<Province> provinces) {
this.provinces = provinces;
}
@Override
public String toString() {
return "Country [country_id=" + country_id + ", birthDate=" + birthDate
+ ", nation=" + nation + ", lakes=" + Arrays.toString(lakes)
+ ", province=" + provinces + ", traffic=" + traffic + "]";
}
}JavaBeanSerializeToJson.java
packagecom.jackson.json.databinding;
importjava.io.File;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.List;
importcom.fasterxml.jackson.annotation.JsonInclude.Include;
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.fasterxml.jackson.databind.SerializationFeature;
publicclassJavaBeanSerializeToJson {
publicstaticvoidconvert()throwsException {
// 使用ObjectMapper来转化对象为Json
ObjectMapper mapper = newObjectMapper();
// 添加功能,让时间格式更具有可读性
SimpleDateFormat dateFormat = newSimpleDateFormat(“yyyy-MM-dd”);
mapper.setDateFormat(dateFormat);
Country country = newCountry(“China”);
country.setBirthDate(dateFormat.parse(”1949-10-01”));
country.setLakes(newString[] {“Qinghai Lake”,“Poyang Lake”,
”Dongting Lake”,“Taihu Lake”});
List nation = newArrayList();
nation.add(”Han”);
nation.add(”Meng”);
nation.add(”Hui”);
nation.add(”WeiWuEr”);
nation.add(”Zang”);
country.setNation(nation);
Province province = newProvince();
province.name = ”Shanxi”;
province.population = 37751200;
Province province2 = newProvince();
province2.name = ”ZheJiang”;
province2.population = 55080000;
List provinces = newArrayList();
provinces.add(province);
provinces.add(province2);
country.setProvinces(provinces);
country.addTraffic(”Train(KM)”,112000);
country.addTraffic(”HighWay(KM)”,4240000);
// 为了使JSON视觉上的可读性,增加一行如下代码,注意,在生产中不需要这样,因为这样会增大Json的内容
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
// 配置mapper忽略空属性
<