json 필드가 null, 결석 또는 존재할 수있는 경우를 나타 내기 위해 POJO에서 Optional을 사용하려고합니다. 내 문제는 잭슨이 Optional.empty()
과 null
을 같은 것으로 취급하지 않도록 설정하는 방법을 이해할 수 없다는 것입니다. empty()
의 경우 필드를 무시하고 싶습니다. JsonInclude 값 중 아무 것도이를 수행하지 않는 것입니다. Jdk8Module#configureAbsentsAsNulls()
는 유망 해 보이지만 내 테스트 결과는 변경되지 않습니다. 이것을 할 수있는 방법이 있습니까?Jackson 선택적 필드 empty() vs null
TL; DR null
값 는 직렬화, Optional.empty()
직렬화되지 않아야한다.
다음은 내가 달성하려고하는 동작을 보여주는 몇 가지 테스트입니다.
class POJO {
public Optional<String> content;
}
private ObjectMapper getMapper() {
return new ObjectMapper().registerModule(new Jdk8Module());
}
@org.junit.Test
public void testAbsent() throws JsonProcessingException {
ObjectMapper mapper = getMapper();
POJO pojo = new POJO();
pojo.content = Optional.empty();
String result = mapper.writeValueAsString(pojo);
assertEquals("{}", result);
}
@org.junit.Test
public void testNull() throws JsonProcessingException {
ObjectMapper mapper = getMapper();
POJO pojo = new POJO();
pojo.content = null;
String result = mapper.writeValueAsString(pojo);
assertEquals("{\"content\":null}", result);
}
@org.junit.Test
public void testPresent() throws JsonProcessingException {
ObjectMapper mapper = getMapper();
POJO pojo = new POJO();
pojo.content = Optional.of("Hello");
String result = mapper.writeValueAsString(pojo);
assertEquals("{\"content\":\"Hello\"}", result);
}
당신은 최소한의 예를 게시시겠습니까 테스트 케이스는 통과하지만 실패 할 것입니다 (예 : 매퍼 구성, 필드를 비우기, 직렬화, 출력 표시)? – chrylis
몇 가지 테스트를 추가했습니다. 미안 그들은 거기에서 시작하지 않았다. – Panda
원래 질문에서 (그리고 테스트에 표시된대로) null을 serialize해야하며 empty()는 안됩니다. 이것은 모듈의 기본 동작이 아닙니다. 이 질문은이 행동을 성취하는 방법에 대한 대답이 아닙니다. – Panda