无法将 json 转换为 pojo class,出现 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 异常

Not able to convert json to pojo class, getting com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException exception

这是我的 JsonObject

JSONObject input = new JSONObject("{\n" + 
                "   \"ColumnNames\":[\"col1\", \"col2\", \"col3\", \"col4\", \"col5\"]\n" + 
                "}");

我的 POJO Class

public class RequestClass {
    private List<String> ColumnNames;

    public void setColumnNames(List<String> ColumnNames) {
        this.ColumnNames = ColumnNames;
    }

    public List<String> getColumnNames() {
        return this.ColumnNames;
    }
}

尝试在 ObjectMapper 的帮助下将 JsonObject 转换为 pojo class 对象,如下所示 -

ObjectMapper mapper = new ObjectMapper();
//mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

RequestClass request = null;
try {
    request = mapper.readValue(input.toString(), RequestClass.class);
} catch (Exception e) {
    e.printStackTrace();
} 

在输出中获取异常

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ColumnNames" (class RequestClass), not marked as ignorable (one known property: "columnNames"])
 at [Source: {"ColumnNames":["col1","col2","col3","col4","col5"]}; line: 1, column: 17] (through reference chain: RequestClass["ColumnNames"])

查看 pojo 中的异常,您提到了 ColumnNames 并且在 json 中您提到了 columnNames (大小写不匹配),尽管您已经定义它在上面的 json 示例中是正确的。请检查字段名是否大小写不匹配

名字叫ColumnNames的私有属性其实是无关紧要的。 属性 是通过内省找到的,查看 getters 和 setters。按照惯例,如果您有名为 getColumnNamessetColumnNames 的方法,它们会定义一个名为 columnNames(小写 c)的 属性。

所以你有两个选择:

  • 将 JSON 中的 属性 的名称更改为 columnNames,或
  • 使用注释覆盖默认的内省行为。

后者是在getter和setter上使用@JsonProperty实现的,如下:

    @JsonProperty("ColumnNames")
    public List<String> getColumnNames() {
        return this.ColumnNames;
    }