当前位置: 首页 > 知识库问答 >
问题:

通用域名格式。fasterxml。杰克逊。数据绑定。exc.UnrecognizedPropertyException:无法识别的字段

苏畅
2023-03-14

我遇到了反序列化问题:

这是我的班级:

public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

我要反序列化的JSON是:

{"ResObj":{"ClientNum":"12345","ServerNum":"78945","IdNum":"020252"},"ResInt":0}

我得到以下例外:

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ResObj" , not marked as ignorable (0 known properties: ])
 at [Source: java.io.StringReader@1f758500; line: 1, column: 20] (through reference chain: ["ResObj"])

我不想补充:

@JsonIgnoreProperties(ignoreUnknown = true)

因为我想得到ResObj...

如果我添加注释,它会通过,但会将其设置为null。。这是我不想要的。

共有3个答案

郭兴文
2023-03-14

我想你应该试试这个

public class Response {
    @JsonProperty
    private Object ResObj;
    @JsonProperty
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

它将解决您的问题与无法识别的属性异常

唐阳泽
2023-03-14

您需要Setter方法来允许Jackson设置属性,并且需要更改json中的字段以小写字母开头:

public class Response {

    private Object ResObj;
    private int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public void setResObj(Object ResObj) {
        this.ResObj = ResObj;
    }

    // ...
}

和:

{"resObj":{"clientNum":"12345","serverNum":"78945","idNum":"020252"},"resInt":0}

JSON更改的原因是Jackson bean序列化将反映在类上,当它看到getXyz()和setXyz()方法时,会将它们映射到JSON文件名“xyz”(而不是“xyz”)。

我认为有几种方法可以覆盖这种行为,一种是使用Jackson注释之一。

牧宁
2023-03-14

如果您不想在bean中使用setter,而只使用字段和getter,那么可以使用ObjectMapper的可见性检查器来允许字段可见性
如下所示:

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setVisibility(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
 类似资料: