本页列出了所有通用的 Jackson 2.0 注释,按功能分组
一、属性命名
@JsonProperty(也表示要包含属性)用于指示外部属性名称、数据格式中使用的名称(JSON或其他支持的数据格式之一)
- @JsonProperty.value:要使用的名称
- @JsonProperty.index:如果数据格式(而不是JSON)是基于索引的,则要使用的物理索引
- @JsonProperty.defaultValue:定义为元数据的文本默认值。注意:核心数据绑定不使用此值;它目前只暴露于扩展模块。
public class MyBean {
public int id;
private String name;
@JsonProperty("name")
public void setTheName(String name) {
this.name = name;
}
@JsonProperty("name")
public String getTheName() {
return name;
}
}
二、属性包含
@JsonAutoDetect:用于重写属性内省定义的类注释。
使用不同属性的不同访问器类型的设置:
- creatorVisibility,用于将构造函数检测为Creator方法(以及少量“众所周知”的静态工厂方法,如valueOf())
- fieldVisibility用于检测Java对象字段
- getterVisibility用于检测“getters”:没有参数值返回名称以“get”前缀开头的方法
- isGetterVisibility用于检测boolean/boolean返回,名称以“is”前缀开头的无参数方法
- setterVisibility用于检测“setters”:单参数采用名称以“set”前缀开头的方法
所有属性都使用Visibility
级别作为值:
- ANY:无论其可见性如何,都会自动检测到隐含类型的访问器
- NON_PRIVATE:如果隐含类型的访问器的可见性不是
private
,则会自动检测到该访问器 - PROTECTED_AND_PUBLIC:如果隐含类型的访问器是
public
orprotected
,则会自动检测到该访问器 - PUBLIC_ONLY:仅当隐含类型的访问器是
public
时才自动检测到它 - NONE:从未自动检测到隐含类型的访问器
- DEFAULT:表示“使用全局默认值”的伪值(也是上述注释属性的默认值)
@JsonIgnore
:用于忽略指定属性的简单注释:
- 只需要添加到访问器/突变器之一(字段、getter/setter、构造函数参数),但会对“whole”属性产生影响:也就是说,向“getter”添加注释也会禁用“setter”
- ...除非 “setter” 有 ,在这种情况下,这被认为是一个启用了 “setter” 但没有 “getter” 的“拆分属性”(“只读”,因此属性可以从输入中读取,但不是写入输出)
@JsonProperty
@JsonIgnoreProperties
:每个类的注释,用于列出要忽略的属性,或指示要忽略任何未知属性。
- 序列化时,忽略列出的属性
@JsonIgnoreProperties({"prop1", "prop2"})
- 在反序列化时,忽略没有 getter/setter 的属性
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonIgnoreType
:每个类的批注,指示要忽略批注类型的所有属性。
@JsonInclude
:用于定义序列化时是否不应包含某些“非值”(null 或空值)的注释;可以基于每个属性使用,也可以用于类的默认值(用于类的所有属性)
属性文档、元数据
@JsonPropertyDescription
(在 2.3 中添加):用于为逻辑属性定义人类可读描述的注释。
- 不由核心数据绑定使用,但由 JSON 架构生成器用于在架构中添加说明。
反序列化和序列化详细信息
@JsonFormat
:具有每类型行为的常规注释;例如,可用于指定序列化日期/时间值时要使用的格式。
lenient
(布尔值)locale
(字符串)pattern
(字符串)shape
(Shape
)timezone
(字符串)with
(JsonFormat.Feature[]
)without
(JsonFormat.Feature[]
)
@JsonUnwrapped
:与 POJO 结构相比,用于定义该值的属性注释在序列化时应“解包”(反序列化时应再次包装),从而导致数据结构扁平化。@JsonView
:用于定义视图的属性注释,其中属性将包含在序列化、反序列化中。
public class EventWithFormat {
public String name;
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "dd-MM-yyyy hh:mm:ss")
public Date eventDate;
}
反序列化详细信息
@JacksonInject
:注释,指示属性应通过“注入”而不是从数据 (JSON) 获取其值。@JsonAnySetter
:用于将双参数方法定义为“any setter”的注释,用于反序列化其他未映射的 JSON 属性的值@JsonCreator
:用于指示应在反序列化期间使用构造函数或静态工厂方法创建值实例的注释。@JsonSetter
:替代@JsonProperty,用于标记指定的方法是“二传手方法”
我们将指定方法s etTheName() 作为 MyBean 实体中 name 属性的 setter:
public class MyBean {
public int id;
private String name;
@JsonSetter("name")
public void setTheName(String name) {
this.name = name;
}
}
@JsonEnumDefaultValue
(在 2.8 中添加):用于在反序列化未知枚举值时定义默认值的注释。需要启用配置功能
序列化详细信息
@JsonAnyGetter:用于将getter定义为“any getter”的注释,该注释返回java.util.Map,其内容将序列化为JSON对象的附加财产,以及对象可能具有的常规财产。
public class ExtendableBean {
public String name;
private Map<String, String> properties;
@JsonAnyGetter
public Map<String, String> getProperties() {
return properties;
}
}
@JsonGetter:替代@JsonProperty,用于标记指定的方法是“getter方法”
public class MyBean {
public int id;
private String name;
@JsonGetter("name")
public String getTheName() {
return name;
}
}
@JsonPropertyOrder:用于指定财产序列化顺序的注释
@JsonPropertyOrder({ "name", "id" })
public class MyBean {
public int id;
public String name;
}
@JsonRawValue:每个属性标记,可用于指定属性的值将按原样“精确”包含在序列化中,没有转义或修饰——对于在输出中嵌入预序列化的JSON(或使用的任何数据格式)很有用
public class RawBean {
public String name;
@JsonRawValue
public String json;
}
@JsonValue:每个属性标记,指示POJO应该使用属性的值进行序列化,通常是java.lang.String(类似annotation to String()方法)
public enum TypeEnumWithValue {
TYPE1(1, "Type A"), TYPE2(2, "Type 2");
private Integer id;
private String name;
// standard constructors
@JsonValue
public String getName() {
return name;
}
}
@JsonRootName:类注释,用于指示用于根值的“包装器”条目的名称,如果启用了根包装
@JsonRootName(value = "user")
public class UserWithRoot {
public int id;
public String name;
}
类型处理
@JsonSubTypes:类注释,用于指示注释类型的子类型;使用逻辑类型名(而不是类名)反序列化多态类型时必需
@JsonTypeId:属性注释,用于指示属性值应用作对象的类型Id,而不是使用类名或外部类型名。
@JsonTypeInfo:类/属性注释,用于指示序列化中包含哪些类型信息以及如何包含的详细信息。
@JsonTypeName:类注释,用于定义要用于注释类的逻辑类型名称;类型名称可以用作类型Id(取决于@JsonTypeInfo的设置)
public class Zoo {
public Animal animal;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "dog"),
@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public static class Animal {
public String name;
}
@JsonTypeName("dog")
public static class Dog extends Animal {
public double barkVolume;
}
@JsonTypeName("cat")
public static class Cat extends Animal {
boolean likesCream;
public int lives;
}
}
对象引用,标识
@JsonManagedReference,@JsonBackReference:一对注释,用于指示和处理用一对匹配的财产表示的父/子关系
@JsonIdentityInfo:类/属性注释,用于指示在序列化/反序列化值时要使用对象标识,以便可以正确地反序列化对单个Java对象的多个引用。这可以用来正确处理循环对象图和有向无循环图。
元注释
此组包括用于其他注释的注释。
- @JacksonAnnotation:添加到所有Jackson定义的注释中的标记注释(包括此包中包含的所有其他注释)
- @JacksonAnnotationsInside:标记的注释,用于指示自定义注释包含Jackson注释;用于允许“注释束”,即使用Jackson注释进行注释的自定义注释(为什么?允许只添加一个注释来表示一组多个Jackson注释)
Use with JAX-RS (DropWizard, Jersey)
尽管值注释可以在 Jackson 本身所在的任何地方使用,但无需额外的工作,但在 JAX-RS 容器上使用 Jackson 时,还需要考虑一些其他事项。 此类容器需要使用 Jackson JAX-RS 提供程序(或等效的胶水实现来注册 Jackson 以在外部格式(如 JSON 和 POJO)之间转换内容)。
一个特定的限制是,尽管 Jackson 可以从它传递的值中自省批注,但它不能直接访问资源方法上的批注。但是,提供程序将获得这些定义,并且它可以使用某些注释。
有关更多信息,请查看 JAX-RS 提供程序 wiki,但简短的说法是,在某种程度上支持以下注释:
- @JsonView:适用于返回值(方法注释)和输入参数(参数注释)
- @JsonRootName:类似适用于返回值和输入值。
- @JacksonAnnotationsInside:完全支持,因此您可以创建和使用“注释包”
- @JacksonFeature:JAX-RS 提供程序特定的注释(未包含在 中)允许为端点启用/禁用 s 和 sjackson-annotationsSerializationFeatureDeserializationFeature
另请注意,注释不是共享的(即,反序列化程序不是传递方法注释;序列化程序也不是传递的参数注释),因此在某些情况下,您可能需要违反 DRY 原则并添加重复的注释
大家好,我是Doker品牌的Sinbad,欢迎点赞和评论,您的鼓励是我们持续更新的动力!欢迎加微信进入技术群聊!