com.fasterxml.Джексон.метод databind.экскавация.UnrecognizedPropertyException: нераспознанное поле

у меня проблема десериализации:

Это мой класс:

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 .. чего я не хочу.

5 ответов


Если вы не хотите иметь сеттера в вашем bean и использовать только поля и геттеры, вы можете использовать visibility checker ObjectMapper, чтобы разрешить видимость поля. Что-то вроде следования

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));

вам нужны методы сеттера, чтобы позволить Джексону установить свойства, и вам нужно изменить поля в 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").

Я думаю, что есть несколько способов, чтобы переопределить такое поведение, один из них-использовать одну из аннотаций Джексона.


Я думаю, вы должны попробовать этот

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

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

это решит вашу проблему с UnrecognizedPropertyExceptions


вам нужно определить другой класс для информации в ResObj {"ClientNum": "12345","ServerNum":"78945","IdNum": "020252"}. Иначе Джексон не сможет определить, как десериализоваться.


public class Response {
    public Object ResObj;
    public int ResInt;

    public Object getResObj() {
        return ResObj;
    }

    public int getResInt() {
        return ResInt;
    } 
} 

используйте это для решения вышеуказанной проблемы.