1、排除属性
@JsonIgnore,一般标记在属性或方法上;作用于序列化与反序列化;
@JsonIgnoreProperties,如果是代理类,由于无法标记在属性或方法上,所以,可以标记在类声明上;也作用于反序列化时的字段解析;
有时POJO包括了一些你不希望输出的属性,在这种情况下可以使用该注解。
或者,你可能忽略掉某些从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,反序列化;
5 、父/子关联
@JsonManagedReference,放在父亲类中;
@JsonBackReference,放在孩子类中;
参考:https://blog.csdn.net/u013772876/article/details/70311985
6、@JsonAutoDetect(作用在类上)来开启/禁止自动检测
fieldVisibility:字段的可见级别
ANY:任何级别的字段都可以自动识别
NONE:所有字段都不可以自动识别
NON_PRIVATE:非private修饰的字段可以自动识别
PROTECTED_AND_PUBLIC:被protected和public修饰的字段可以被自动识别
PUBLIC_ONLY:只有被public修饰的字段才可以被自动识别
DEFAULT:同PUBLIC_ONLY
jackson默认的字段属性发现规则如下:
所有被public修饰的字段->所有被public修饰的getter->所有被public修饰的setter
当一个privite属性没有getter和setter也就无法被序列化或反序列化,
使用@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) ,调整为ANY
就可以序列化和反序列化了。
同理,除了fieldVisibility可以设置外,还可以设置getterVisibility、setterVisibility、isGetterVisibility、creatorVisibility级别
这个需要详细看。
7、@JsonIgnoreProperties
作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉,可以将它看做是@JsonIgnore的批量操作,但它的功能比@JsonIgnore要强,比如一个类是代理类,我们无法将将@JsonIgnore标记在属性或方法上,此时便可用@JsonIgnoreProperties标注在类声明上,它还有一个重要的功能是作用在反序列化时解析字段时过滤一些未知的属性,否则通常情况下解析到我们定义的类不认识的属性便会抛出异常。
可以注明是想要忽略的属性列表如@JsonIgnoreProperties({"name","age","title"}),
也可以注明过滤掉未知的属性如@JsonIgnoreProperties(ignoreUnknown=true)
@JsonIgnoreProperties({"name","age","title"})
public static class TestPOJO{
private int id;
private String name;
private int age;
//getters、setters省略
}
8、@JsonUnwrapped
作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象。一个对象中的属性是另一个对象,将其序列化,就需要加这个。
9、@JsonIdentityInfo
2.0+版本新注解,作用于类或属性上,被用来在序列化/反序列化时为该对象或字段添加一个对象识别码,通常是用来解决循环嵌套的问题,比如数据库中的多对多关系,通过配置属性generator来确定识别码生成的方式,有简单的,配置属性property来确定识别码的名称,识别码名称没有限制。
对象识别码可以是虚拟的,即存在在JSON中,但不是POJO的一部分,这种情况下我们可以如此使用注解
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class,property = "@id")
例子:参考链接吧。
10、@JsonNaming
jackson 2.1+版本的注解,作用于类或方法,注意这个注解是在jackson-databind包中而不是在jackson-annotations包里,它可以让你定制属性命名策略,作用和前面提到的@JsonProperty的重命名属性名称相同。
11、多态类型处理
参考:http://a52071453.iteye.com/blog/2175398 这个讲的太全了,看不过来了,就放着吧。
http://blog.lifw.org/post/24921108
https://www.cnblogs.com/moon521/p/6179342.html