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;
}
}
используйте это для решения вышеуказанной проблемы.