Com.fasterxml.jackson.databind.exc.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: [email protected]; line: 1, column: 20] (through reference chain: ["ResObj"])
Я не хочу добавлять:
@JsonIgnoreProperties(ignoreUnknown = true)
потому что я хочу получить ResObj...
если я добавлю аннотацию, она пройдет, но она установит ее как нуль.. которую я не хочу.
Ответы
Ответ 1
Если вы не хотите устанавливать сеттер в своем bean и используете только поля и получатели, вы можете использовать средство проверки видимости объекта ObjectMapper, чтобы разрешить видимость поля. Что-то вроде следующего
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
Ответ 2
Вам нужны методы 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" ).
Я думаю, что есть несколько способов отменить это поведение, одним из них является использование одной из аннотаций Джексона.
Ответ 3
Я думаю, вы должны попробовать это
public class Response {
@JsonProperty
private Object ResObj;
@JsonProperty
private int ResInt;
public Object getResObj() {
return ResObj;
}
public int getResInt() {
return ResInt;
}
}
Он разрешит вашу проблему с помощью UnrecognizedPropertyExceptions
Ответ 4
Вам необходимо определить другой класс для информации в ResObj { "ClientNum": "12345", "ServerNum": "78945", "IdNum": "020252" }. В противном случае Джексон не может определить, как десериализоваться.
Ответ 5
public class Response {
public Object ResObj;
public int ResInt;
public Object getResObj() {
return ResObj;
}
public int getResInt() {
return ResInt;
}
}
Используйте это, чтобы устранить вышеуказанную проблему.