UnrecognizedPropertyException:无法识别的字段-杰克逊2.9

时间:2019-11-18 22:43:36

标签: jackson

我正在使用Jackson进行简单的转换:

response = mapper.readValue(responseStr, PrinterStatus.class);

代码抛出此异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "OutputParameters" (class com.xerox.PrinterStatus), 
not marked as ignorable (one known property: "outputParameters"]) at ....  
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:823)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1153)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1589)

我要转换的Json非常简单:

{
    "OutputParameters": {
        "@xmlns": "http://xmlns.xerox.com/apps/rest/",
        "@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
        "GETPRINTERSTATUS": {
            "GETPRINTERSTATUS_ITEM": [{
                "STATUS": "True",
                "MESSAGE": " "
            }]
        }
    }
}

这是PrinterStatus类,它具有字段“ OutputParameters”
所以我不确定杰克逊在叫什么。

public class PrinterStatus {

private OutputParameters outputParameters;

public OutputParameters getOutputParameters() {
    return outputParameters;
}

public void setOutputParameters(OutputParameters outputParameters) {
    this.outputParameters = outputParameters;
}

...

1 个答案:

答案 0 :(得分:1)

基本上,JSON密钥区分大小写。因此,OutputParameters不等于outputParameters

所以您必须选择:

  1. 将Java类中的字段(也包括getters / setters)重命名为OutputParameters
  2. 将JSON属性密钥重命名为outputParameters
  3. 如果您使用Jackson 2.9或更高版本,只需对字段进行如下注释:
public class PrinterStatus {

    @JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
    private OutputParameters outputParameters;

    public OutputParameters getOutputParameters() {
        return outputParameters;
    }

    public void setOutputParameters(OutputParameters outputParameters) {
        this.outputParameters = outputParameters;
    }
...
}
  1. 显式设置属性名称
public class PrinterStatus {

    @JsonProperty("OutputParameters")
    private OutputParameters outputParameters;
...
}
  1. 全局启用案例敏感功能
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);