📜  Jackson注释教程(1)

📅  最后修改于: 2023-12-03 15:31:27.830000             🧑  作者: Mango

Jackson注释教程

Jackson是一个快速、具有简单API和强大的数据绑定功能的Java库,常用于JSON和XML的序列化和反序列化。其中,Jackson注释(Jackson Annotations)是一种自定义Jackson序列化和反序列化的方式,开发者可以使用注释来自定义JSON或XML的输出或输入格式。

常用Jackson注释

以下是常用的Jackson注释:

@JsonProperty

用于指定JSON中的属性名称,作用类似于Java中的属性字段名,但JSON中的属性名需要遵循camelCase命名规范,而Java中的属性名一般采用驼峰命名规范。@JsonProperty注释可以指定JSON中属性的名称,例如:

public class User {
    @JsonProperty("user_id")
    private int userId;
    private String name;
    private String email;
    // getter和setter方法省略
}

当Java对象序列化为JSON时,会将userId属性的值序列化为"user_id",而不是"userId"。

@JsonIgnore

用于指定某些属性在序列化或反序列化时忽略,例如:

public class User {
    private int userId;
    private String name;
    @JsonIgnore
    private String password;
    // getter和setter方法省略
}

当Java对象序列化为JSON时,将不会包含password属性的值。

@JsonFormat

用于指定某个属性在序列化或反序列化时的格式,例如:

public class Event {
    private String name;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'", timezone = "UTC")
    private Date eventTime;
    // getter和setter方法省略
}

在这个例子中,eventTime属性将以"yyyy-MM-dd'T'HH:mm:ss'Z'"格式序列化为字符串,例如"2019-12-31T23:59:59Z"。

@JsonInclude

用于控制某些属性在序列化时是否输出,默认情况下,属性值为null或空字符串时不会输出,而使用@JsonInclude注释可以控制是否输出,例如:

public class User {
    private int userId;
    private String name;
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String email;
    // getter和setter方法省略
}

在这个例子中,将始终输出email属性的值,即使它的值为null或空字符串。

@JsonTypeInfo

用于在多态类型中指定类型标识符,例如:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Circle.class, name = "circle"),
        @JsonSubTypes.Type(value = Rectangle.class, name = "rectangle") })
public abstract class Shape {
    // 可以包含公共的属性和方法
}

在这个例子中,@JsonTypeInfo注释指定了类型标识符使用"name"方式传递,且在JSON属性中使用"type"属性名,@JsonSubTypes注释指定了可能的子类类型及其名称。