我需要将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