Jackson 库提供了两种方式来实现枚举对象和 code 自动转换。

  1. 使用 @JsonFormat 注解

可以在枚举类中使用 @JsonFormat 注解来指定 code 和枚举对象之间的映射关系,示例代码如下:

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Gender {
    MALE(1, "男"),
    FEMALE(2, "女");

    private final int code;
    private final String desc;

    Gender(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public int getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}

这里通过 @JsonFormat 注解的 shape 属性来指定序列化方式为 OBJECT,即将枚举对象序列化为 JSON 对象。这样在序列化和反序列化时,就会自动将 code 和枚举对象之间进行相互转换。

  1. 注册 EnumDeserializer

可以通过 ObjectMapper 对象注册 EnumDeserializer 来实现枚举对象和 code 自动转换,示例代码如下:

public class EnumCodeConvertDemo {
    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Gender.class, new EnumDeserializer());
        objectMapper.registerModule(module);

        String json = "{\"code\":1,\"desc\":\"男\"}";
        Gender gender = objectMapper.readValue(json, Gender.class);
        System.out.println(gender); // MALE

        String json2 = objectMapper.writeValueAsString(gender);
        System.out.println(json2); // {"code":1,"desc":"男"}
    }

    private static class EnumDeserializer extends StdDeserializer<Gender> {
        protected EnumDeserializer() {
            super(Gender.class);
        }

        @Override
        public Gender deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            JsonNode node = p.getCodec().readTree(p);
            int code = node.get("code").asInt();
            for (Gender gender : Gender.values()) {
                if (gender.getCode() == code) {
                    return gender;
                }
            }
            return null;
        }
    }
}

这里通过 SimpleModule 对象注册了一个 EnumDeserializer,用于将 JSON 中的 code 转换为对应的枚举对象。在序列化时,也会自动将枚举对象转换为 JSON 对象

Jackson 枚举对象 和code 自动转换

原文地址: https://www.cveoy.top/t/topic/fWfF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录