Ich versuche, Optional in einem POJO zu verwenden, um anzuzeigen, wenn ein JSON-Feld null, abwesend oder vorhanden sein kann. Mein Problem ist, dass ich nicht herausfinden kann, wie man jackson so konfiguriert, dass Optional.empty()
und null
nicht gleich behandelt werden. Für empty()
möchte ich das Feld ignoriert werden. Keiner der JsonInclude-Werte scheint dies zu tun. Jdk8Module#configureAbsentsAsNulls()
sah vielversprechend aus, aber es ändert nicht die Ergebnisse meiner Tests. Gibt es eine Möglichkeit, dies zu tun?Jackson optionales Feld leer() vs null
tl; dr null
Werte sollte serialisiert werden, Optional.empty()
sollte nicht serialisiert werden.
Hier sind einige Tests, die das Verhalten zeigen, das ich versuche zu erreichen.
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);
}
bitten Sie daher ein minimales Beispiel schreiben Testfall, den Sie voraussichtlich bestehen, aber nicht erfolgreich ist (z. B. den Mapper konfigurieren, ein Feld auf leer setzen, serialisieren, Ausgabe anzeigen)? – chrylis
Nur einige Tests hinzugefügt. Entschuldigung, sie waren nicht dort, um damit zu beginnen. – Panda
Wie ich in der ursprünglichen Frage sagte (und wie in den Tests angegeben), sollte null serialisiert werden und leer() sollte nicht. Dies ist nicht das Standardverhalten des Moduls. Diese Frage beantwortet nicht, wie man dieses Verhalten erreicht. – Panda