一般情况下使用JSON只使用了java对象与字符串的转换,但是,开发APP时候,我们经常使用实体类来做转换;这样,就需要用到注解;
Jackson默认是针对get方法来生成JSON字符串的,可以使用注解来做一些特殊用途;常见的使用如下:
1、@Transient
@[email protected]映射,ORM框架将忽略该属性;
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架默认其注解为@Basic;
//表示该字段在数据库表中没有
@Transient
public int getAge() {
return 1+1;
}
2、@JsonIgnoreProperties
此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
3、@JsonIgnore
此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。
4、@JsonFormat
此注解用于属性或者方法上(最好是属性上),可以方便的把Date类型直接转化为我们想要的模式,比如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")
5、@JsonSerialize
此注解用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。
6、@JsonDeserialize
此注解用于属性或者setter方法上,用于在反序列化时可以嵌入我们自定义的代码,类似于上面的@JsonSerialize
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 排除属性 @JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化; @JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;
2 属性别名 @JsonProperty,序列化/反序列化都有效;
3 属性排序 @JsonPropertyOrder,注释在类声明中;
4 属性格式转换 使用自定义序列化/反序列化来处理; @JsonSerialize,序列化; @JsonDeserialize,反序列化;
注意:在使用hibernate的时候,查询数据库后产生的实体类是个代理类,这时候转换JSON会报错; 解决方法有两种: 1)设置FAIL_ON_EMPTY_BEANS属性,告诉Jackson空对象不要抛异常; mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS); 2)使用@JsonIgnoreProperties注解 在实体类声明处加上@JsonIgnoreProperties(value ={"hibernateLazyInitializer ", "handler"})注解; 建议使用@JsonIgnoreProperties注解,这样生成的JSON中不会产生多余的字段;
5 父/子关联 @JsonManagedReference,放在父亲类中; @JsonBackReference,放在孩子类中;
6 去掉包装 @JsonUnwrapped,意思如下: Ability to map JSON like { "name" : "home", "latitude" : 127, "longitude" : 345 } to classes defined as: class Place { public String name;
@JsonUnwrapped public Location location; }
class Location { public int latitude, longitude; }