我需要将 JsonArray 反序列化为布尔值。如果数组存在且不为空,则该值应设置为“true”。
问题是,我的自定义反序列化器虽然功能正常,但会破坏其余字段的反序列化 - 它们被设置为空。
Object:
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
@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 自定义解串器破坏了默认解串器 https://stackoverflow.com/questions/35525471/jackson-custom-deserializer-breaks-default-ones),但不幸的是它的答案为零。
由于当我重新排列 Json 时代码可以正常工作,因此看起来自定义反序列化器并未用于所有字段,而是 Jackson 在执行自定义反序列化器时停止了反序列化。