jackson-modules-java8
jackson-modules-java8 copied to clipboard
Absent nested optional shennanigans
Uh... so this is partially for science, I guess. It's obscure enough to not matter, but I'd like to understand the reasoning. I stumbled upon this because I am working on a smaller databind library myself and of course I'm always comparing to Jackson for sensible defaults. Observe the following:
record R(Optional<Optional<String>> s) { }
R r = new ObjectMapper()
.registerModule(new Jdk8Module())
.readValue("{}", new TypeReference<>() {});
assertFalse(r.s.isPresent());
Here, an Optional<Optional<String>>
property is absent from the JSON to deserialize. Naively, I expected the property to be set to an empty optional, but actually it's Optional.of(Optional.empty())
, so the snippet above crashes.
I didn't find any tests which explicitly cover this here, so I guess it wasn't really considered a worthwhile edge case. But I think following through with these weird cases helps in figuring out consistent behaviour in general. Do you think that the current behaviour (Optional.of(Optional.empty())
) is correct or do you think Optional.empty()
would be correct?