@JsonCreator
注解是 Jackson 库中用于指定如何从 JSON 数据创建 Java 对象实例的一个重要工具。它允许你定义一个静态方法(通常是构造函数或静态工厂方法),Jackson 在反序列化时会调用这个方法来生成对象实例。@JsonCreator
注解可以应用于方法、构造函数或注解类型,并且可以通过 mode()
属性指定不同的工作模式。
@JsonCreator
注解的组成部分
@Target
:- 指定该注解可以应用的目标元素。对于
@JsonCreator
,它可以应用于注解类型 (ElementType.ANNOTATION_TYPE
)、方法 (ElementType.METHOD
) 和构造函数 (ElementType.CONSTRUCTOR
)。
- 指定该注解可以应用的目标元素。对于
@Retention(RetentionPolicy.RUNTIME)
:- 表示该注解在运行时可用。这意味着框架(如 Jackson)可以在运行时通过反射读取这些注解信息。
@JacksonAnnotation
:- 这个注解表明
@JsonCreator
是 Jackson 序列化/反序列化库的一部分,用于内部处理和优化。
- 这个注解表明
Mode
枚举:Mode
枚举定义了@JsonCreator
可以使用的不同模式,每个模式决定了 Jackson 如何解析输入 JSON 并调用带有@JsonCreator
注解的方法。
Mode
枚举的解释
DEFAULT
:- 默认模式。Jackson 会尝试根据方法签名自动匹配 JSON 属性到构造函数或静态工厂方法的参数。如果方法参数与 JSON 字段名称匹配,则直接使用这些值。
DELEGATING
:- 委托模式。在这种模式下,Jackson 将整个 JSON 输入作为单个参数传递给被注解的方法。这通常用于复杂的数据结构或需要基于多个 JSON 属性进行逻辑判断的情况。例如,当你的方法接收一个
Map<String, Object>
或者其他容器类型的参数时,表示整个 JSON 对象将被传递进来。
- 委托模式。在这种模式下,Jackson 将整个 JSON 输入作为单个参数传递给被注解的方法。这通常用于复杂的数据结构或需要基于多个 JSON 属性进行逻辑判断的情况。例如,当你的方法接收一个
PROPERTIES
:- 属性模式。类似于默认模式,但是更明确地指定了每个参数都应被视为独立的 JSON 属性。这种模式适用于你希望确保每个参数都能准确对应到 JSON 中的一个字段的情况。
DISABLED
:- 禁用模式。表示不使用此注解的功能。通常情况下不会使用此选项,除非你需要在某些特定条件下禁用
@JsonCreator
的行为。
- 禁用模式。表示不使用此注解的功能。通常情况下不会使用此选项,除非你需要在某些特定条件下禁用
示例
假设我们有一个简单的类 User
,并且我们想要通过用户名和密码创建它的实例:
public class User {
private final String username;
private final String password;
// 使用 DEFAULT 模式
@JsonCreator
public User(@JsonProperty("username") String username,
@JsonProperty("password") String password) {
this.username = username;
this.password = password;
}
// 使用 DELEGATING 模式
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static User createUser(Map<String, Object> json) {
String username = (String) json.get("username");
String password = (String) json.get("password");
return new User(username, password);
}
// 使用 PROPERTIES 模式
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public static User createWithProperties(
@JsonProperty("username") String username,
@JsonProperty("password") String password) {
return new User(username, password);
}
}
在这个例子中:
User
类有三个构造函数/静态工厂方法,每个都使用了不同的@JsonCreator.Mode
。DEFAULT
模式的构造函数让 Jackson 自动匹配 JSON 字段。DELEGATING
模式的静态方法接受整个 JSON 对象作为一个Map
。PROPERTIES
模式的静态方法明确指出每个参数都应该来自 JSON 中对应的属性。