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()); } }