Spring Boot 自定义 Jackson

在使用 Spring Boot 进行开发时,我们经常需要将对象转换为 JSON 或者将 JSON 转换为对象。Spring Boot 默认使用的是 Jackson 进行 JSON 的序列化和反序列化。Jackson 是一个功能强大的 JSON 处理库,但是它的默认行为可能并不总是符合我们的需求。本文将介绍如何使用 Spring Boot 自定义 Jackson 的一些常见需求。

1. 自定义日期格式

在默认情况下,Jackson 会将日期转换为 ISO 8601 格式的字符串。如果我们需要使用其他格式的日期,可以使用 @JsonFormat 注解来自定义日期格式。

public class User {
    private String name;
    
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    
    // Getters and setters
}

在上面的例子中,@JsonFormat(pattern = "yyyy-MM-dd") 注解指定了将日期格式化为 "yyyy-MM-dd" 的字符串。

2. 排除字段

有时候我们并不想将某些字段序列化到 JSON 中,可以使用 @JsonIgnore 注解来排除这些字段。

public class User {
    private String name;
    
    @JsonIgnore
    private String password;
    
    // Getters and setters
}

在上面的例子中,@JsonIgnore 注解将 password 字段排除在 JSON 序列化之外。

3. 自定义字段名称

有时候我们想要将 Java 对象中的字段名称和 JSON 中的字段名称进行映射,可以使用 @JsonProperty 注解来自定义字段名称。

public class User {
    @JsonProperty("username")
    private String name;
    
    // Getters and setters
}

在上面的例子中,@JsonProperty("username") 注解将 name 字段的名称映射为 "username"。

4. 处理空值

默认情况下,Jackson 不会序列化空值字段,也不会反序列化 JSON 中的空值。如果我们想要自定义空值的处理逻辑,可以使用 @JsonInclude 注解来指定字段的空值处理策略。

public class User {
    private String name;
    
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String email;
    
    // Getters and setters
}

在上面的例子中,@JsonInclude(JsonInclude.Include.NON_NULL) 注解将 email 字段排除在 JSON 序列化之外,如果该字段的值为 null。

5. 自定义序列化器和反序列化器

有时候我们需要自定义字段的序列化和反序列化逻辑,可以通过实现 JsonSerializerJsonDeserializer 接口来实现自定义的序列化器和反序列化器。

public class CustomDateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(value);
        gen.writeString(formattedDate);
    }
}

public class CustomDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String dateStr = p.getText();
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            return formatter.parse(dateStr);
        } catch (ParseException e) {
            throw new IOException("Failed to deserialize date", e);
        }
    }
}

然后,我们需要在需要自定义序列化和反序列化的字段上使用 @JsonSerialize@JsonDeserialize 注解来指定自定义的序列化器和反序列化器。

public class User {
    private String name;
    
    @JsonSerialize(using = CustomDateSerializer.class)
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date birthday;
    
    // Getters and setters
}

在上面的例子中,@JsonSerialize(using = CustomDateSerializer.class) 注解将 birthday 字段的序列化逻辑指定为 CustomDateSerializer@JsonDeserialize(using = CustomDateDeserializer.class) 注解将 birthday 字段的反序列化逻辑指定为 CustomDateDeserializer

以上就是几个常见的自定义 Jackson 的用法。通过自定义 Jackson,我们可以更加灵活地控制 JSON 的序列化和反序列化行为,以满足我们的需求。

注意: