Jackson Core 是一个流处理 API,用于高效地处理 JSON 数据的解析和生成。相比于 Jackson Databind,Jackson Core 提供了更低级别的控制,并允许开发者在不依赖 POJO 类的情况下操作 JSON 数据。这使得它非常适合处理大规模 JSON 数据或对性能要求高的场景。
一、准备
在使用 Jackson Core 之前,需要在项目中添加相关依赖。如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.15.2</version>
</dependency>
如果使用 Gradle,则可以在 build.gradle 文件中添加以下依赖:
implementation 'com.fasterxml.jackson.core:jackson-core:2.15.2'
添加依赖后,即可在项目中使用 Jackson Core 进行 JSON 数据的处理。
二、基本用法
1. 使用 JsonParser 解析 JSON 数据
Jackson Core 提供了 JsonParser 类,用于逐步解析 JSON 数据。通过这个类,可以在 JSON 数据流中按需解析出所需的数据,特别适合处理大文件或流数据。
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import java.io.File;
import java.io.IOException;
public class BasicJacksonCoreUsage {
    public static void main(String[] args) {
        try {
            JsonFactory factory = new JsonFactory();
            JsonParser parser = factory.createParser(new File("data.json"));
            while (!parser.isClosed()) {
                JsonToken token = parser.nextToken();
                if (JsonToken.FIELD_NAME.equals(token)) {
                    String fieldName = parser.getCurrentName();
                    System.out.println("Field Name: " + fieldName);
                    token = parser.nextToken();
                    if ("name".equals(fieldName)) {
                        System.out.println("Name: " + parser.getValueAsString());
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
通过 JsonParser,可以手动遍历 JSON 字符串,逐步提取所需的字段和值。
三、进阶用法
1. 使用 JsonGenerator 生成 JSON 数据
除了解析 JSON 数据,Jackson Core 还提供了 JsonGenerator 类,用于生成 JSON 数据。开发者可以使用该类将 Java 数据流式地写入到 JSON 文件或输出流中。
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import java.io.File;
import java.io.IOException;
public class AdvancedJacksonCoreUsage {
    public static void main(String[] args) {
        try {
            JsonFactory factory = new JsonFactory();
            JsonGenerator generator = factory.createGenerator(new File("output.json"));
            generator.writeStartObject();
            generator.writeStringField("name", "Alice");
            generator.writeNumberField("age", 30);
            generator.writeEndObject();
            generator.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
通过 JsonGenerator,可以流式地生成 JSON 数据,并写入文件或其他输出目的地。这种方法适用于需要动态构建 JSON 内容的场景。
四、实际应用
1. 解析和生成大型 JSON 文件
Jackson Core 在处理大型 JSON 文件时表现出色,特别是在需要同时解析和生成数据的场景中。结合 JsonParser 和 JsonGenerator,可以实现流式处理 JSON 数据,减少内存占用,提高性能。
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.core.JsonGenerator;
import java.io.File;
import java.io.IOException;
public class LargeJsonProcessing {
    public static void main(String[] args) {
        try {
            JsonFactory factory = new JsonFactory();
            JsonParser parser = factory.createParser(new File("large_input.json"));
            JsonGenerator generator = factory.createGenerator(new File("large_output.json"));
            generator.writeStartArray();
            while (!parser.isClosed()) {
                JsonToken token = parser.nextToken();
                if (JsonToken.START_OBJECT.equals(token)) {
                    generator.writeStartObject();
                    while (!JsonToken.END_OBJECT.equals(token)) {
                        token = parser.nextToken();
                        if (JsonToken.FIELD_NAME.equals(token)) {
                            String fieldName = parser.getCurrentName();
                            generator.writeFieldName(fieldName);
                            token = parser.nextToken();
                            if (JsonToken.VALUE_STRING.equals(token)) {
                                generator.writeString(parser.getValueAsString());
                            } else if (JsonToken.VALUE_NUMBER_INT.equals(token)) {
                                generator.writeNumber(parser.getValueAsInt());
                            }
                        }
                    }
                    generator.writeEndObject();
                }
            }
            generator.writeEndArray();
            parser.close();
            generator.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
在这个应用中,JsonParser 和 JsonGenerator 协同工作,可以高效地读取和写入大型 JSON 文件,而不会导致过多的内存占用。
五、总结
Jackson Core 提供了高效的 JSON 解析和生成 API,适用于需要对 JSON 数据进行流式处理的场景。通过 JsonParser 和 JsonGenerator,开发者可以对大规模 JSON 数据进行精细化控制,而不依赖于高层的 POJO 类映射。掌握 Jackson Core 的基本和进阶用法后,可以灵活应对各种复杂的 JSON 数据处理需求。
51工具盒子