当前位置: 首页 > 面试题库 >

如何忽略杰克逊JSON到对象映射中的枚举字段?

燕翼
2023-03-14
问题内容

我有一个JSON对象,例如:

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

要么

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

要么

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

等等

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

@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;
  }
}

上面的映射工作正常,但是将来会有更多的“ Grade”类型让我们说D,E等,这会破坏现有的映射并引发以下异常

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

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

谢谢


问题答案:

我认为您应该为枚举定义外部解串器Grade

我在枚举中添加了其他字段-未知:

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 + "]";
    }
}

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

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例如。



 类似资料:
  • 我有一个Json数组,数组中包含< code>null值。 如何配置Jackson ObjectMapper以忽略此类数组元素-就好像它是空数组? 约束: 没有控制源类-它是第三方类 数组元素类型前期未知 数组名称前面未知

  • 问题内容: 我有以下json文件: 但是java模型如下: Jackson解析时会引发异常,因为“ externalId”字段没有getter或setter方法。有没有可以用来忽略json字段的装饰器? 问题答案: 您可以使用注释;如果这只是您要跳过的一个值,则类似于: 或忽略任何无法使用的东西: 还有其他方法可以做到这一点,其余的请查看FasterXML Jackson wiki 。

  • 问题内容: 我有一个User类,我想使用Jackson映射到JSON。 我使用-将其映射到JSON字符串 我不想映射变量。有什么方法可以配置映射器,使其忽略此字段? 我知道我可以编写自定义数据映射器或使用Streaming API,但我想知道是否可以通过配置来做到这一点? 问题答案: 您有两种选择: 杰克逊致力于田野工匠。因此,您只需删除要在JSON中省略的字段的getter。(如果您不需要在其他

  • 问题内容: 我在使用Jackson映射Javascript发布的哈希表(标记)数组时遇到问题。 这是控制器@RequestBody接收到的数据(以正确的json requestheader发送): 这是控制器: 当我调试并查看“实体”值时,它显示为通用对象的ArrayList,而不是我期望的“标签”类型的对象列表。 我如何让杰克逊将传递的对象数组映射到“标签”类型的对象列表? 谢谢 问题答案: 听

  • 问题内容: 这是我的Java代码,用于反序列化,我正在尝试将json字符串转换为java对象。为此,我使用了以下代码: 和我的product.java类 我收到以下错误。 帮我解决这个问题 问题答案: 似乎您正在尝试从JSON读取一个实际描述数组的对象。Java对象使用花括号映射到JSON对象,但是您的JSON实际上以方括号指定一个数组开始。 您实际拥有的是一个。为了描述泛型类型,由于Java的类

  • 问题内容: 我如何使用jackson像下面的示例那样创建json数组。 我尝试使用ObjectMapper,但这似乎不正确。 最终,我将制作一个具有以下值的json。 这是我提供的一个示例json。 编辑1 提出以下更接近的json,但我不知道为什么在{}之前和之后加引号。 最终答案 问题答案: 您需要一个: 此类具有创建s,s,s,s,s和诸如此类的方法。s和s具有便捷的变异方法,可以直接添加大