Jackson(http://jackson.codehaus.org)庫是基於java語言的開源json格式解析工具。相對於javajson解析的其他庫,諸如json-lib、gson包,Jackson具有以下優點:
功能全面,提供多種模式的json解析方式,“對象綁定”使用方便,利用注解包能為我們開發提供很多便利。
性能較高,“流模式”的解析效率超過絕大多數類似的json包。
jackson主要的包
jackson-core——核心包(必須),提供基於“流模式”解析的API。核心包:JsonPaser(json流讀取),JsonGenerator(json流輸出)。
jackson-databind——數據綁定包(可選),提供基於“對象綁定”和“樹模型”相關API。數據綁定包:ObjectMapper(構建樹模式和對象綁定模式),JsonNode(樹節點)。
jackson-annotations——注解包(可選),提供注解功能。
jackson-datatype-joda-2.1.5.jar——日期轉換
Jackson注解
1. 重命名屬性,忽略屬性,以及修改屬性所使用的類型。
① 屬性重命名時使用的注解
最常見的使用方式之一就是改變某個成員屬性所使用的JSON名稱。例如: class Name { @JsonProperty("firstName") public String _first_name; }
②忽略屬性使用的注解
有時POJO包括了一些你不希望輸出的屬性,在這種情況下,你可以進行如下操作:
public class Value {
public int value;
@JsonIgnore public int internalValue;
}
或者,你可能忽略掉某些從JSON數據中得到的屬性,如果是這樣,你可以使用:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
public int value;
}
或者,更粗暴點的,忽略掉從JSON(由於在應用中沒有完全匹配的POJO)中獲得的所有“多余的”屬性。
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
public int value;
}
③choose more/less specific types 時使用的注解
在有些情況下,Jackson在讀入或輸出一個成員屬性時,所選用的類型(type)可能並不是你想要的
@JsonSerialize(as=BasicType.class) 將類型序列化成指定類型
@JsonSerialize(using=CustomDoubleSerialize.class) 作用於屬性或者字段上,用於在序列化時嵌入我們自定義的代碼,比如序列化一個double時在其后面限制兩位小數點。
@JsonDeserialize 作用於屬性或者字段上,指定反序列化方式
@JsonDeserialize(as=ValueImpl.class) 將類型反序列化成指定類型
@JsonDeserialize(using= CustomDateDeserialize.class) 用於在反序列化時嵌入我們自定義的代碼
2. 使用構造器或工廠方法
在默認情況下,當由JSON數據創建相應類的實例時,Jackson嘗試使用該類的“默認”構造器(即無參數構造器)。不過,你可以選擇使用其他的構造器,或者一個靜態工廠方法,來創建實例。完成這個操作,你需要使用@JsonCreator注解,有可能還需要使用@JsonProperty注解給參數(arguments)綁定名稱。
publicclass MyBean { private int value;
@JsonCreator publicMyBean(@JsonProperty("value") int v) { this.value = v; } public int getValue() { return value; } }
使用相同的方式,可以將@JsonCreator用在靜態工廠方法上。不過,還有一個可選的替代方案,被稱作“授權式”構建器(“delegating” creator):
publicclass DelegatingPOJO { private final int _x, _y; @JsonCreator publicDelegatingPOJO(Map<String,Object> delegate) { _x = (Integer)delegate.get("x"); _y = (Integer)delegate.get("y"); } }
不同之處在於,構建器方法只能有一個參數,而且參數一定不要(must NOT)添加@JsonProperty注解。
3. 處理多態類型
如果你要進行讀取、輸出操作的對象擁有許多可能的子類型(即表現出多態性),你可能還需要添加一些類型信息。Jackson在反序列化時(讀取JSON數據,生成相應的對象)需要這些信息,以便能正確地讀取對象的類型。我們可以通過在“基本類型”上添加@JsonTypeInfo注解來完成操作:
@JsonTypeInfo 類注解,當輸出操作的對象擁有多個子類型且在反序列化時需要添加子類對象的類型信息,使用此注解可以正確地設置子類對象的類型
@JsonTypeInfo(use=Id.CLASS,include=As.PROPERTY,property=”class”) 子類類型作為屬性,屬性名為class
// 將Java類的名稱(“com.myempl.ImplClass”)存儲到JSON的一個名稱為“class”的屬性中
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY,property=”class”)
public abstract class BaseClass {
}
public class Impl1 extends BaseClass {
public int x;
}
public class Impl2 extends BaseClass {
public String name;
}
public class PojoWithTypedObjects {
public List<BaseClass> items;
}
items序列化之后的結果類似:
{“items” : [
{“class”:”Impl2”, “name”: “Bob”},
{“class”:”Impl1”, :”x” : 13}
]}
4. 重新設置屬性的自動發現(Changing property auto-detection)
@JsonAutoDetect
類注解,指定屬性發現規則
Jackson默認的屬性發現規則將會查找到如下所述的屬性:
•所有被public修飾的字段(成員變量);
•所有被public修飾的getter(即形如“getXxx()”的方法);
•所有被public修飾的setter(即形如“setXxx(value)”的方法)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
更多注解查看http://wiki.fasterxml.com/JacksonAnnotations
原文:http://blog.csdn.net/ljhabc1982/article/details/17553095