且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何忽略 Jackson JSON-to-Object 映射中的枚举字段?

更新时间:2022-03-30 22:15:58

我认为你应该定义外部 deserializer 用于 Grade 枚举.

I think you should define external deserializer for Grade enum.

我向枚举添加了额外的字段 - 未知:

I added additional field to enum - UNKNOWN:

enum Grade {
    A, B, C, UNKNOWN;

    public static Grade fromString(String value) {
        for (Grade grade : values()) {
            if (grade.name().equalsIgnoreCase(value)) {
                return grade;
            }
        }

        return UNKNOWN;
    }
}
class Employee {

    @JsonDeserialize(using = GradeDeserializer.class)
    private Grade grade;
    private String name;

    public Grade getGrade() {
        return grade;
    }

    public void setGrade(Grade grade) {
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Employee [grade=" + grade + ", name=" + name + "]";
    }
}

现在,解析器看起来像这样:

Now, parser could look like that:

class GradeDeserializer extends JsonDeserializer<Grade> {
    @Override
    public Grade deserialize(JsonParser parser, DeserializationContext context)
            throws IOException, JsonProcessingException {
        return Grade.fromString(parser.getValueAsString());
    }
}

示例用法:

public class JacksonProgram {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        JsonFactory jsonFactory = new JsonFactory();
        JsonParser parser = jsonFactory
                .createJsonParser("{"name":"John", "grade":"D"}");
        Employee employee = objectMapper.readValue(parser, Employee.class);
        System.out.println(employee);
    }

}

输出:

Employee [grade=UNKNOWN, name=John]

如果你不想添加额外的字段,你可以返回 null 例如.

If you don't want to add additional field, you would return null for example.