FasterXML / FasterXML/jackson-modules-java8

`Optional<JsonNode>` deserialization from "absent" value does not work in the expected way

Đang mở
#250 4 bình luận 2 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Java
Star
425
Fork
124
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

Example:
```java
public record MyRecord(
Optional myField
) {
}
```

When deserialized from: `{}`
Expected:
`myField.isPresent() == false`
Actual:
`myField.isPresent() == true`

This is because `myField` gets set to an `Optional` of a `NullNode`

After spending some time looking into the source code of both the `jackson-databind` and the `jackson-datatype-jdk8` libraries, the problem seems to lie in the `OptionalDeserializer` (or higher).

During deserialization, when a property is missing, the `PropertyValueBuffer::_findMissing` method is called and in it, this piece of code is called:
https://github.com/FasterXML/jackson-databind/blob/0fe97e0d69b7d5362907b094d5b979bc2216dc4a/src/main/java/com/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer.java#L203
```java
// Third: NullValueProvider? (22-Sep-2019, [databind#2458])
// 08-Aug-2021, tatu: consider [databind#3214]; not null but "absent" value...
Object absentValue = prop.getNullValueProvider().getAbsentValue(_context);
if (absentValue != null) {
return absentValue;
}
```

The `OptionalDeserializer` is not overriding its inherited `getAbsentValue` method to return `Optional.ofNullable(_valueDeserializer.getAbsentValue(ctxt));` (or similar).

Due to the lack of the overriding, the inherited `getAbsentValue` method actually calls `getNullValue` instead as can be seen here:
https://github.com/FasterXML/jackson-databind/blob/0fe97e0d69b7d5362907b094d5b979bc2216dc4a/src/main/java/com/fasterxml/jackson/databind/JsonDeserializer.java#L349
```java
@Override
public Object getAbsentValue(DeserializationContext ctxt) throws JsonMappingException {
return getNullValue(ctxt);
}
```

In the case of a `JsonNode`, the `JsonNodeDeserializer` is used. This deserializer overrides the `getNullValue` method to return a `NullNode`.

https://github.com/FasterXML/jackson-databind/blob/0fe97e0d69b7d5362907b094d5b979bc2216dc4a/src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java#L73
```java
@Override
public JsonNode getNullValue(DeserializationContext ctxt) {
return ctxt.getNodeFactory().nullNode();
}
```

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.