如何忽略 Jackson JSON-to-Object 映射中的枚举字段? [英] How to ignore enum fields in Jackson JSON-to-Object mapping?

查看:31
本文介绍了如何忽略 Jackson JSON-to-Object 映射中的枚举字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类似于以下内容的 JSON 对象:

I have a JSON Object something like:

{"name":"John", "grade":"A"}

{"name":"Mike", "grade":"B"}

{"name":"Simon", "grade":"C"}

我正在尝试将上述 JSON 映射到:

I am trying to map the above JSON to:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Employee{
      @JsonIgnoreProperties(ignoreUnknown = true)
      public enum Grade{ A, B, C }
      Grade grade;
      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;
  }
}

上述映射工作正常,但将来会有更多等级"类型,比如 D、E 等,这会破坏现有映射并抛出以下异常

the above mapping works fine but in the future there will be more "Grade" types let say D,E etc which breaks the existing mapping and throws the following exception

05-08 09:56:28.130: W/System.err(21309): org.codehaus.jackson.map.JsonMappingException: Can not construct instance of Employee from String value 'D': value not one of declared Enum instance names

有没有办法忽略枚举类型中的未知字段?

Is there a way to ignore unknown fields with in enum types?

谢谢

推荐答案

我认为你应该定义外部 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.

这篇关于如何忽略 Jackson JSON-to-Object 映射中的枚举字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆