杰克逊@JsonProperty的枚举

时间:2018-05-17 08:59:17

标签: java json enums jackson

假设我有一个枚举:

public enum ParameterList {
    FREQUENCY_ID("500");
    ...
    lot's of different constants here
    ...

    private final String param;

    ParameterList(String param) {
        this.param = param;
    }

    @Override
    public String toString() {
        return param;
    }
}

让我说我有一个DTO字段:

private String frequency;

假设我有JSON

{"500" : "100Hz"}

我想将此json映射到我的dto,因此DTO.frequency的值为json的"500"字段(将为"100Hz")。

我知道只有常量必须用作属性值,但有一些解决方法可以使以下工作吗?

@JsonProperty(ParameterList.FREQUENCY_ID)
private String frequency;

@JsonPropertycom.fasterxml.jackson.annotation.JsonProperty,版本2.8.0)

我们的想法是在枚举ParameterList.FREQUENCY_ID"500"更改为其他值时最小化代码编辑。

2 个答案:

答案 0 :(得分:4)

您可以尝试以下方法:

public enum ParameterList {

    FREQUENCY_ID(Constants.FREQUENCY_ID_VALUE);

    private final String value;

    ParameterList(String value) {
        this.value= value;
    }

    @Override
    public String toString() {
        return value;
    }

    public static class Constants {
        public static final String FREQUENCY_ID_VALUE = "500";
    }
}

然后使用:

@JsonProperty(ParameterList.Constants.FREQUENCY_ID_VALUE)
private String frequency;

答案 1 :(得分:2)

json有点奇怪,{"admin": "superuser"}如果像{"role": "superuser"}(或userType而不是role)那样会更清楚。但是,要将值映射到枚举,您所要做的就是在DTO中指定它。对于你的json和枚举也将superuser作为值

public enum UserType {
    ADMIN, SUPERUSER
....
}

您所要做的就是让您的DTO具有类型

的枚举
private UserType admin; // <-- admin because that's your key's name (maybe change that)

请注意,您也可以使用

@JsonProperty("admin") private UserType userType; // or whatever name you like 

或类似的东西,如果你不能改变json。