@JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化;
@JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;
有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作:
public class Value {
public int value;
@JsonIgnore public int internalValue;
}
这时得到的JSON数据结果如下:
{ "value" : 42 }
或者,你可能忽略掉某些从JSON数据中得到的属性,如果是这样,你可以使用:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
public int value;
}
这样就能够处理像如下所示的JSON数据:
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }
最后,你甚至能简单地忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。你可以通过添加如下 代码 完成这个操作:
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
public int value;
}
2 属性别名(属性重命名时使用的注解)
@JsonProperty,序列化/反序列化都有效;
最常见的使用方式之一就是改变某个成员属性所使用的JSON名称,例如:
public class Name {
@JsonProperty("firstName")
public String _first_name;
}
将会生成如下所示的JSON数据结果:
{ "firstName" : "Bob" }
而不是:
{ "_first_name" : "Bob"}
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;
}