Jackson @JsonValue 和 @JsonCreator 处理枚举序列化与反序列化

可以使用@JsonValue@JsonCreator注解自定义枚举的序列化与反序列化需求。

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public enum Status {
        ACTIVE("A"), INACTIVE("I"), PENDING("P");

        private final String code;

        Status(String code) {
            this.code = code;
        }

        @JsonValue
        public String getCode() {
            return code;
        }

        @JsonCreator
        public static Status fromCode(String code) {
            for (Status status : Status.values()) {
                if (status.getCode().equals(code)) {
                    return status;
                }
            }
            throw new IllegalArgumentException("Unknown code: " + code);
        }
    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // 序列化
        String json = mapper.writeValueAsString(Status.ACTIVE);
        System.out.println("Serialized: " + json); // 输出:"A"

        // 反序列化
        Status status = mapper.readValue("\"I\"", Status.class);
        System.out.println("Deserialized: " + status); // 输出:INACTIVE
    }
}

其中@JsonValue@JsonCreator注解分别用于序列化和反序列化。

@JsonValue注解用于指示应该被序列化为 JSON 对象的值,可作用于方法或字段。@JsonCreator注解用于指示用于创建对象实例的构造函数或工厂方法。

posted @ 2025-06-04 22:56  Higurashi-kagome  阅读(328)  评论(0)    收藏  举报