如何使用Jackson将Java Enums序列化和反序列化为JSON对象

ncp*_*ips 5 java enums jackson

鉴于Enum:

public enum CarStatus {
    NEW("Right off the lot"),
    USED("Has had several owners"),
    ANTIQUE("Over 25 years old");

    public String description;

    public CarStatus(String description) {
        this.description = description;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们如何设置它,以便杰克逊可以将此枚举的实例序列化和反序列化为以下格式.

{
    "name": "NEW",
    "description": "Right off the lot"
}
Run Code Online (Sandbox Code Playgroud)

默认是简单地将枚举序列化为字符串.例如"NEW".

ncp*_*ips 15

  1. 使用JsonFormat注释让Jackson将枚举作为JSON对象取消.
  2. 创建一个静态构造函数,接受a JsonNode和注释所述构造函数@JsonCreator.
  3. 为枚举的名称创建一个getter.

这是一个例子.

// 1
@JsonFormat(shape = JsonFormat.Shape.Object)
public enum CarStatus {
    NEW("Right off the lot"),
    USED("Has had several owners"),
    ANTIQUE("Over 25 years old");

    public String description;

    public CarStatus(String description) {
        this.description = description;
    }

    // 2
    @JsonCreator
    public static CarStatus fromNode(JsonNode node) {
        if (!node.has("name"))
            return null;

        String name = node.get("name").asText();

        return CarStatus.valueOf(name);
    }

    // 3
    @JsonProperty
    public String getName() {
        return name();
    }
}
Run Code Online (Sandbox Code Playgroud)