You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为单个枚举常量配置多个JsonProperty映射?

给单个枚举常量绑定多个JsonProperty值的解决方案

当然可以实现你想要的效果!如果你用的是Jackson(毕竟@JsonProperty是它的核心注解),有两种简单的方式能让空字符串和"default"都映射到PrintType.DEFAULT枚举常量:

方案一:使用@JsonAlias注解(推荐,Jackson 2.9+)

@JsonAlias是Jackson专门用来给字段/枚举添加反序列化别名的注解,完美适配你的需求——你只需要给DEFAULT常量加上这个注解,把空字符串作为别名即可:

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;

public enum PrintType {
    @JsonProperty("default")
    @JsonAlias("") // 把空字符串添加为反序列化别名
    DEFAULT,
    // 其他枚举常量示例
    PDF,
    EXCEL
}

这个方案的好处是代码简洁、侵入性低:序列化的时候依然输出"default"(由@JsonProperty控制),但反序列化时无论是"default"还是空字符串,都会被解析成DEFAULT。

方案二:自定义枚举反序列化器(兼容旧版本Jackson)

如果你的Jackson版本低于2.9,或者需要更复杂的反序列化逻辑(比如处理空白字符串、大小写兼容等),可以自定义一个JsonDeserializer:

步骤1:实现反序列化器

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;

public class PrintTypeDeserializer extends JsonDeserializer<PrintType> {
    @Override
    public PrintType deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String value = p.getText().trim(); // 顺便处理空白字符串的情况
        if (value.isEmpty() || "default".equals(value)) {
            return PrintType.DEFAULT;
        }
        // 其他值交给默认枚举解析逻辑(注意大小写匹配)
        return PrintType.valueOf(value.toUpperCase());
    }
}

步骤2:给枚举类绑定反序列化器

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(using = PrintTypeDeserializer.class)
public enum PrintType {
    @JsonProperty("default")
    DEFAULT,
    PDF,
    EXCEL
}

这种方式的优势是灵活性极高,你可以在反序列化器里处理各种边缘情况,但代码量会比第一种方案多一些。

测试验证

不管用哪种方案,你都可以写个简单的测试来验证效果:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class TestEnumDeserialization {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        
        // 测试空字符串反序列化
        PrintType emptyValue = mapper.readValue("\"\"", PrintType.class);
        System.out.println(emptyValue); // 输出 DEFAULT
        
        // 测试"default"反序列化
        PrintType defaultVal = mapper.readValue("\"default\"", PrintType.class);
        System.out.println(defaultVal); // 输出 DEFAULT
        
        // 测试序列化
        String json = mapper.writeValueAsString(PrintType.DEFAULT);
        System.out.println(json); // 输出 "default"
    }
}

内容的提问来源于stack exchange,提问作者hellzone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:30:09