@JsonCreator 注解

发布于:2025-02-11 ⋅ 阅读:(32) ⋅ 点赞:(0)

@JsonCreator 注解是 Jackson 库中用于指定如何从 JSON 数据创建 Java 对象实例的一个重要工具。它允许你定义一个静态方法(通常是构造函数或静态工厂方法),Jackson 在反序列化时会调用这个方法来生成对象实例。@JsonCreator 注解可以应用于方法、构造函数或注解类型,并且可以通过 mode() 属性指定不同的工作模式。

@JsonCreator 注解的组成部分

  1. @Target:

    • 指定该注解可以应用的目标元素。对于 @JsonCreator,它可以应用于注解类型 (ElementType.ANNOTATION_TYPE)、方法 (ElementType.METHOD) 和构造函数 (ElementType.CONSTRUCTOR)。
  2. @Retention(RetentionPolicy.RUNTIME):

    • 表示该注解在运行时可用。这意味着框架(如 Jackson)可以在运行时通过反射读取这些注解信息。
  3. @JacksonAnnotation:

    • 这个注解表明 @JsonCreator 是 Jackson 序列化/反序列化库的一部分,用于内部处理和优化。
  4. Mode 枚举:

    • Mode 枚举定义了 @JsonCreator 可以使用的不同模式,每个模式决定了 Jackson 如何解析输入 JSON 并调用带有 @JsonCreator 注解的方法。

Mode 枚举的解释

  • DEFAULT:

    • 默认模式。Jackson 会尝试根据方法签名自动匹配 JSON 属性到构造函数或静态工厂方法的参数。如果方法参数与 JSON 字段名称匹配,则直接使用这些值。
  • DELEGATING:

    • 委托模式。在这种模式下,Jackson 将整个 JSON 输入作为单个参数传递给被注解的方法。这通常用于复杂的数据结构或需要基于多个 JSON 属性进行逻辑判断的情况。例如,当你的方法接收一个 Map<String, Object> 或者其他容器类型的参数时,表示整个 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 中对应的属性。