From 978d32bbb43777303c8a741a35ef4b930638c94e Mon Sep 17 00:00:00 2001 From: asmhatre Date: Tue, 4 Aug 2026 17:33:19 +0000 Subject: [PATCH] Part 6: streaming parser filter with the Jackson 3 token/accessor names --- .../G01StreamingParserFilter.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/main/java/com/ankurm/jackson3/part6streaming/G01StreamingParserFilter.java diff --git a/src/main/java/com/ankurm/jackson3/part6streaming/G01StreamingParserFilter.java b/src/main/java/com/ankurm/jackson3/part6streaming/G01StreamingParserFilter.java new file mode 100644 index 0000000..63759ff --- /dev/null +++ b/src/main/java/com/ankurm/jackson3/part6streaming/G01StreamingParserFilter.java @@ -0,0 +1,73 @@ +package com.ankurm.jackson3.part6streaming; + +import tools.jackson.core.JsonParser; +import tools.jackson.core.JsonToken; +import tools.jackson.core.json.JsonFactory; + +import java.io.File; +import java.nio.file.Files; + +/** + * Post: Streaming API and JsonNode — https://ankurm.com/jackson-streaming-api-jsonnode/ + * Section: "Reading a Large JSON Array with JsonParser" + * + * Jackson 3 differences from the post's code: + * 1. JsonFactory is in tools.jackson.core.json — NOT tools.jackson.core. + * 2. parser.getCurrentName() is now parser.currentName(). + * 3. parser.getText() is now parser.getString(). + * 4. JsonToken.FIELD_NAME is now JsonToken.PROPERTY_NAME. + * 5. No `throws IOException` — Jackson 3 exceptions are unchecked. + */ +public class G01StreamingParserFilter { + + private static final String SAMPLE = """ + [ + {"level":"INFO","message":"Application started"}, + {"level":"ERROR","message":"Database connection failed"}, + {"level":"INFO","message":"Retrying connection"} + ] + """; + + public static void main(String[] args) throws Exception { + File logFile = File.createTempFile("large-logs", ".json"); + Files.writeString(logFile.toPath(), SAMPLE); + logFile.deleteOnExit(); + + JsonFactory jsonFactory = new JsonFactory(); + int errorCount = 0; + + try (JsonParser parser = jsonFactory.createParser(tools.jackson.core.ObjectReadContext.empty(), logFile)) { + + // Confirm the root is an array + if (parser.nextToken() != JsonToken.START_ARRAY) { + throw new IllegalStateException("Expected a JSON array at the root"); + } + + // Walk each element in the array + while (parser.nextToken() != JsonToken.END_ARRAY) { + + String logLevel = null; + String logMessage = null; + + // Walk each property inside the current object + while (parser.nextToken() != JsonToken.END_OBJECT) { + String fieldName = parser.currentName(); + parser.nextToken(); // move to the value + + if ("level".equals(fieldName)) { + logLevel = parser.getString(); + } else if ("message".equals(fieldName)) { + logMessage = parser.getString(); + } + // All other fields are skipped automatically + } + + if ("ERROR".equals(logLevel)) { + System.out.println("ERROR: " + logMessage); + errorCount++; + } + } + } + System.out.println("Total errors found: " + errorCount); + } +}