From 3ac9163232ea48e7b249c9f9f31d5631294f54a5 Mon Sep 17 00:00:00 2001 From: asmhatre Date: Tue, 4 Aug 2026 17:31:35 +0000 Subject: [PATCH] Part 4: custom deserialiser using ctxt.readTree and null-safe path() --- .../E02MoneyValueDeserializer.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/com/ankurm/jackson3/part4custom/E02MoneyValueDeserializer.java diff --git a/src/main/java/com/ankurm/jackson3/part4custom/E02MoneyValueDeserializer.java b/src/main/java/com/ankurm/jackson3/part4custom/E02MoneyValueDeserializer.java new file mode 100644 index 0000000..68277f4 --- /dev/null +++ b/src/main/java/com/ankurm/jackson3/part4custom/E02MoneyValueDeserializer.java @@ -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 { + + 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); + } +}