1
0

Part 4: custom deserialiser using ctxt.readTree and null-safe path()

This commit is contained in:
2026-08-04 17:31:35 +00:00
parent f487566ae0
commit 3ac9163232

View File

@@ -0,0 +1,35 @@
package com.ankurm.jackson3.part4custom;
import tools.jackson.core.JsonParser;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.JsonNode;
import tools.jackson.databind.deser.std.StdDeserializer;
import java.math.BigDecimal;
/**
* Post: Custom Serialisers and Mix-ins — https://ankurm.com/jackson-custom-serializer-mixin/
* Section: "Writing a Custom Deserialiser"
*
* Jackson 3 differences from the post's code:
* 1. jsonParser.getCodec().readTree(jsonParser) is gone. Use ctxt.readTree(parser).
* 2. No `throws IOException` — JacksonException is unchecked.
* 3. path() rather than get(), so a missing field yields a MissingNode instead of
* a NullPointerException. The post's version NPEs on {"currency":"USD"}.
* 4. A bare decimalValue() on a MissingNode THROWS in Jackson 3 (it returned
* BigDecimal.ZERO in Jackson 2). Use the defaulting overload.
*/
public class E02MoneyValueDeserializer extends StdDeserializer<Money> {
public E02MoneyValueDeserializer() {
super(Money.class);
}
@Override
public Money deserialize(JsonParser jsonParser, DeserializationContext ctxt) {
JsonNode rootNode = ctxt.readTree(jsonParser);
BigDecimal amount = rootNode.path("amount").decimalValue(BigDecimal.ZERO);
String currency = rootNode.path("currency").asString("GBP"); // default when absent
return new Money(amount, currency);
}
}