Jackson JSON 解析枚举值

ser*_*ces 0 java enums json jackson

假设我有一个枚举类,如下所示:

public enum Lang {

    ENGLISH("en_US"), FRENCH("fr_CA");

    String val;

    Lang(String val) {
       this.val = val;
    }

    public String getValue() {
        return val;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个 POJO 如下:

public class Foo {

    private String bar;
    private Lang lang;


    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

    public Lang getLang() {
        return lang;
    }

    public void setLang(Lang lang) {
        this.lang = lang;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何配置 Jackson 以将以下有效负载转换为 POJO 类?

{ "bar": "someValue", "lang": "en-US"}

如果我使用“en-US”或“fr-CA”以外的任何其他字符串,则杰克逊需要拒绝它。

当我有类似以下内容时,我看到的是:

{"bar":"bar","lang":"ENGLISH"}



Foo f = new Foo();
        f.setBar("bar");
        f.setLang(Lang.ENGLISH);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(f);
        System.out.println(json);
Run Code Online (Sandbox Code Playgroud)

除了“en-US”或我在枚举类中定义的任何内容之外,我不想要任何文本。我如何自定义杰克逊来做到这一点?

JB *_*zet 5

您可以使用以下代码/注释:

@JsonFormat
public enum Lang {

    ENGLISH("en_US"), 
    FRENCH("fr_CA");

    private String val;

    Lang(String val) {
        this.val = val;
    }

    @JsonValue
    public String getValue() {
        return val;
    }

    @JsonCreator
    public static Lang fromValue(String value) {
        // TODO return the Lang with the given value, or throw an IllegalArgumentException
    }
}
Run Code Online (Sandbox Code Playgroud)