我需要將JsonArray反序列化爲布爾值。如果數組存在且不爲空,則該值應設置爲「true」。 問題是,我的自定義反序列化器在功能上打破了其餘字段的反序列化 - 它們被設置爲null。Jackson定製解串器打破其他字段的反序列化
對象:
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 +
'}';
}
}
解串器:
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
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();
}
如果我刪除了 「ARR」 陣列或將其移動到JSON,底部一切都很好。如果我把它留在頂部 - TestObject{name='null', exists=true, logins=null}
。
還有類似的問題(Jackson Custom Deserializer breaks default ones),但不幸的是它沒有答案。 因爲當我重新排列Json時,代碼可以正常工作,所以它看起來並不像自定義反序列化器用於所有字段,而是Jackson在執行自定義反序列化器時停止反序列化。
我的建議是不要將數組反序列化爲布爾值。將數組反序列化爲一個數組/列表/集合並使'getExists'返回'arr!= null'或其他類型。 – Paul
@Paul這真的有用,感謝這個想法,不知何故,我沒有想到這一點。問題是它看起來有點醜陋和晦澀,但如果沒有其他辦法,我會這樣做。 –
有時,你必須選擇兩個醜陋的解決方案的漂亮:)我很高興我可以幫助...我會讓我的評論一個答案。 – Paul