From f02e158c796709811c634feb37eaef2b00ce646b Mon Sep 17 00:00:00 2001 From: asmhatre Date: Tue, 4 Aug 2026 17:29:15 +0000 Subject: [PATCH] Part 0: the same payload read by data binding, tree model and streaming --- .../part0setup/A03ThreeProcessingModels.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/com/ankurm/jackson3/part0setup/A03ThreeProcessingModels.java diff --git a/src/main/java/com/ankurm/jackson3/part0setup/A03ThreeProcessingModels.java b/src/main/java/com/ankurm/jackson3/part0setup/A03ThreeProcessingModels.java new file mode 100644 index 0000000..a132910 --- /dev/null +++ b/src/main/java/com/ankurm/jackson3/part0setup/A03ThreeProcessingModels.java @@ -0,0 +1,45 @@ +package com.ankurm.jackson3.part0setup; + +import tools.jackson.core.JsonParser; +import tools.jackson.core.JsonToken; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; + +/** + * Post: Jackson 101 — https://ankurm.com/jackson-java-tutorial/ + * Section: "Jackson's Three Processing Models" + * + * The same payload read three ways, so the trade-off is concrete rather than a table. + */ +public class A03ThreeProcessingModels { + + public record Order(Long orderId, String status) { } + + private static final String JSON = "{\"orderId\":1001,\"status\":\"SHIPPED\"}"; + + public static void main(String[] args) { + JsonMapper mapper = JsonMapper.builder().build(); + + // 1. DATA BINDING — the right answer roughly 95% of the time. + Order bound = mapper.readValue(JSON, Order.class); + System.out.println("1. data binding : " + bound); + + // 2. TREE MODEL — schema not known at compile time; navigate a JsonNode. + JsonNode tree = mapper.readTree(JSON); + System.out.println("2. tree model : orderId=" + tree.path("orderId").asInt() + + " status=" + tree.path("status").asString()); + + // 3. STREAMING — token by token, constant memory, no document ever built. + StringBuilder streamed = new StringBuilder(); + try (JsonParser parser = mapper.createParser(JSON)) { + while (parser.nextToken() != null) { + if (parser.currentToken() == JsonToken.PROPERTY_NAME) { + String field = parser.currentName(); + parser.nextToken(); // advance to the value + streamed.append(field).append('=').append(parser.getString()).append(' '); + } + } + } + System.out.println("3. streaming : " + streamed.toString().trim()); + } +}