Ich muss JServerArray zu einem booleschen Wert deserialisieren. Wenn ein Array existiert und nicht leer ist, sollte der Wert auf "true" gesetzt werden. Das Problem ist, meine benutzerdefinierte Deserializer, während funktional, Deserialisierung der Rest der Felder bricht - sie werden auf Null gesetzt.Jackson benutzerdefinierten Deserializer bricht Deserialisierung anderer Felder
Objekt:
private static class TestObject {
private String name;
@JsonProperty("arr")
@JsonDeserialize(using = Deserializer.class)
private Boolean exists = null;
private Integer logins;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getExists() {
return exists;
}
public void setExists(boolean exists) {
this.exists = exists;
}
public Integer getLogins() {
return logins;
}
public void setLogins(Integer logins) {
this.logins = logins;
}
@Override
public String toString() {
return "TestObject{" +
"name='" + name + '\'' +
", exists=" + exists +
", logins=" + logins +
'}';
}
}
Deserializer:
public class Deserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException {
if (jp.getCurrentToken() == JsonToken.START_ARRAY) {
return true;
}
return false;
}
}
-Test
@Test
public void test() throws JsonParseException, IOException {
Boolean result = deserialize();
}
private Boolean deserialize() throws IOException, JsonParseException,
JsonProcessingException {
TestObject testObject = mapper.readValue("{\n" +
" \"arr\": [\n" +
" {\"value\": \"New\"}\n" +
" ],\n" +
" \"name\": \"name\",\n" +
" \"logins\": 36" +
"}",
TestObject.class);
System.out.println(testObject.toString());
return testObject.getExists();
}
Wenn ich die "arr" Array entfernen oder auf dem Boden des Json, alles ist in Ordnung bewegen . Wenn ich es oben lasse - TestObject{name='null', exists=true, logins=null}
.
Es gab eine ähnliche Frage (Jackson Custom Deserializer breaks default ones), aber leider hat es keine Antworten. Da der Code ordnungsgemäß funktioniert, wenn ich Json neu anordne, sieht es nicht so aus, als würde Custom Deserializer für alle Felder verwendet, sondern Jackson stoppt die Deserialisierung, wenn es den benutzerdefinierten Deserializer ausführt.
Mein Vorschlag ist es, ein Array nicht zu einem booleschen zu deserialisieren. Deserialisieren Sie das Array zu einem Array/list/set und lassen Sie 'getExists' return 'arr! = Null' oder ähnliches. – Paul
@Paul Das funktioniert tatsächlich, danke für die Idee, irgendwie habe ich nicht daran gedacht. Das Problem ist, dass es ein bisschen hässlich und undurchsichtig aussieht, aber wenn es keinen anderen Weg gibt, werde ich es so machen. –
Manchmal muss man das hübschere von zwei hässlichen Lösungen wählen :) Ich bin froh, dass ich helfen konnte ... Ich werde meinen Kommentar eine Antwort geben. – Paul