http://blog.csdn.net/nomousewch/article/details/8949899
http://wong-john.iteye.com/blog/1753402
http://bbs.jee-soft.cn:8086/showtopic-156.aspx
jackson注解
Jackson(http://jackson.codehaus.org)库是基于java语言的开源json格式解析工具,相对于javajson解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:
功能全面,提供多种模式的json解析方式,“对象绑定”使用方便,利用注解包能为我们开发提供很多便利。
性能较高,“流模式”的解析效率超过绝大多数类似的json包。
jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。
核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。
jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。
数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。
jackson-annotations——注解包(可选),提供注解功能。
jackson-datatype-joda-2.1.5.jar——日期转换
Jackson注解
@JsonIgnoreProperties
类注解, 作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。用法很简单@JsonIgnoreProperties({"property1","property2"}),Hibernate延时加载
因为jsonplugin用的是java的内审机制.hibernate会给被管理的pojo加入一个 hibernateLazyInitializer属性,jsonplugin会把hibernateLazyInitializer也拿出来操作,并读取里面一个不能被反射操作的属性就产生了这个异常,可以用annotation来排除hibernateLazyInitializer这个属性。
@JsonIgnore
作用于属性或字段上,用来表明,当生成json的时候忽略有该annotation的方法或字段
@JsonProperty("firstName")
作用于属性或字段上,重命名
@JsonFormat
作用于属性或者字段上,方便的把Date类型直接转化为我们想要的模式,如@JsonFormat(pattern ="yyyy-MM-dd HH-mm-ss")
@JsonSerialize
作用于属性或者字段上,指定序列化方式
@JsonSerialize(as=BasicType.class)
将类型序列化成指定类型
@JsonSerialize(using=CustomDoubleSerialize.class)
作用于属性或者字段上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
@JsonSerialize(using= CustomDoubleSerialize.class)
publicclass CustomDateDeserialize extends JsonDeserializer<Date> {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public Date deserialize(JsonParser jp,DeserializationContext ctxt)
throws IOException,JsonProcessingException {
Date date = null;
try {
date =sdf.parse(jp.getText());
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
@JsonDeserialize
作用于属性或者字段上,指定反序列化方式
@JsonDeserialize(as=ValueImpl.class)
将类型反序列化成指定类型
@JsonDeserialize(using= CustomDateDeserialize.class)
用于在反序列化时嵌入我们自定义的代码
publicclass CustomDateDeserialize extends JsonDeserializer<Date> {
private SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd");
@Override
public Date deserialize(JsonParser jp,DeserializationContext ctxt)
throws IOException,JsonProcessingException {
Date date = null;
try {
date =sdf.parse(jp.getText());
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
@JsonCreator
作用于使用构造器方法或工厂方法 ,指定反序列化时创建实例方式(默认使用无参数构造器)
采用构造器方式
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");
}
}
@JsonTypeInfo
类注解,当输出操作的对象拥有多个子类型且在反序列化时需要添加子类对象的类型信息,使用此注解可以正确地设置子类对象的类型
@JsonTypeInfo(use=Id.CLASS,include=As.PROPERTY,property=”class”)
子类类型作为属性,属性名为class
"animals": [ {
"class" :"jackson.Lion",
"name" : "Simba",
"sound" : "Roar",
"type" : "carnivorous",
"endangered" : true
}]
@JsonTypeInfo(use=Id.CLASS,include= As.WRAPPER_OBJECT)
"animals": [ {
"jackson.Lion" : {
"name" : "Simba",
"sound" : "Roar",
"type" :"carnivorous",
"endangered" : true
}
}]
这个注解还有很多配置可以进行设置
@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