JsonArray를 부울 값으로 비 직렬화해야합니다. 배열이 존재하고 비어 있지 않으면 값을 "true"로 설정해야합니다. 문제는 내 사용자 지정 디시리얼라이저가 기능을 수행하는 동안 나머지 필드의 비 직렬화를 깨뜨리는 것입니다. 즉, 이들은 null로 설정됩니다.잭슨 사용자 지정 디시리얼라이저가 다른 필드의 비 직렬화를 중단 함
대상 :
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();
}
나는 "도착"배열을 제거하거나 JSON, 하단 모두의 벌금을 이동하는 경우 . 내가 상단에두면 - TestObject{name='null', exists=true, logins=null}
.
비슷한 질문 (Jackson Custom Deserializer breaks default ones)이 있었지만 불행히도 대답이 없습니다. Json을 재정렬 할 때 코드가 제대로 작동하므로 사용자 지정 deserializer가 모든 필드에 사용되는 것처럼 보이지 않습니다. Jackson은 사용자 지정 디시리얼라이저를 실행할 때 deserialization을 중지합니다.
내 제안은 배열을 부울로 역 직렬화하지 않는 것입니다. 배열을 배열 /리스트/집합으로 비 직렬화하고'getExists'가'arr! = null' 또는 일부를 반환하도록하십시오. – Paul
@ 폴 이것은 실제로 작동합니다. 아이디어 덕분에, 어떻게 든 생각하지 않았습니다. 문제는 그것이 약간 못 생기고 가려 보이지만 다른 방법이 없다면 그렇게 할 것입니다. –
때로는 두 가지 추악한 솔루션으로 더 예쁘게 선택해야합니다 :) 제가 도와 드릴 수있어서 기쁩니다 ... 제 대답에 답을 할 것입니다. – Paul