Jackson系列-jackson-core

358 阅读2分钟

介绍

jackson-core是jackson的最核心部分,它提供了对JSON数据的完整⽀持。 此模块提供了最具底层的Streaming JSON解析器/⽣成器,这组流式API属于Low-Level API,具有⾮常显著的特点:

  • 开销⼩,损耗⼩,性能极⾼
  • 因为是Low-Level API,所以灵活度极⾼
  • ⼜因为是Low-Level API,所以易错性⾼,可读性差 jackson-core 模块提供了两种处理JSON的⽅式(整个Jackson⼀共3种):
  1. 流式API:读取并将JSON内容写⼊作为离散事件 -> JsonParser 读取数据,⽽ JsonGenerator 负责写⼊数据
  2. 树模型:JSON⽂件在内存⾥以树形式表示。此种⽅式也很灵活,它类似于XML的DOM解析

概念

  • 流式(Streaming):此概念与Java8的Stream流是完全不同的。这里指的是I/O流,所以在读/写后都需要close
  • 增量模式:它表示每个部分一个一个地往上增加。后面的例子会体现
  • JsonToken: 每一部分都是一个独立的Token(有不同类型的Token),最终被“拼凑”起来就是一个JSON

DEMO

JsonGenerator写

@Test
    void generatorTest() throws Exception {
        JsonFactory jsonFactory = new JsonFactory();
        JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File("test.json"), JsonEncoding.UTF8);
        jsonGenerator.writeStartObject();

        jsonGenerator.writeStringField("name", "generator-test");
        jsonGenerator.writeNumberField("age", 22);

        // 写入一个对象
        jsonGenerator.writeFieldName("object");
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("name", "nested-object");
        jsonGenerator.writeStringField("value", "this is a test");
        jsonGenerator.writeEndObject();

        //写入一个数组格式
        jsonGenerator.writeFieldName("list");
        jsonGenerator.writeStartArray();
        jsonGenerator.writeString("computer");
        jsonGenerator.writeString("helicopter");
        jsonGenerator.writeEndArray();

        jsonGenerator.writeEndObject();

        jsonGenerator.close();
    }

JsonParser读

    @Test
    void parserTest() throws Exception {
        JsonFactory jsonFactory = new JsonFactory();

        JsonParser jsonParser = jsonFactory.createParser(new File("test.json"));
        JsonToken jsonToken = null;
        while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = jsonParser.getCurrentName();
            if ("name".equals(fieldName)) {
                jsonToken = jsonParser.nextToken();
                System.out.println("==============token类型是:" + jsonToken);
                System.out.println(jsonParser.getText());
            } else if ("age".equals(fieldName)) {
                jsonToken = jsonParser.nextToken();
                System.out.println("==============token类型是:" + jsonToken);
                System.out.println(jsonParser.getIntValue());
            } else if ("object".equals(fieldName)) {
                jsonToken = jsonParser.nextToken();
                System.out.println("==============token类型是:" + jsonToken);
                while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                    String dogFieldName = jsonParser.getCurrentName();
                    if ("name".equals(dogFieldName)) {
                        jsonToken = jsonParser.nextToken();
                        System.out.println("======================token类型是:" + jsonToken);
                        System.out.println(jsonParser.getText());
                    } else if ("value".equals(dogFieldName)) {
                        jsonToken = jsonParser.nextToken();
                        System.out.println("======================token类型是:" + jsonToken);
                        System.out.println(jsonParser.getText());
                    }
                }
            } else if ("list".equals(fieldName)) {
                jsonToken = jsonParser.nextToken();
                System.out.println("==============token类型是:" + jsonToken);
                while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
                    System.out.println(jsonParser.getText());
                }
            }
        }
    }

基础包核心包的使用主要就是这一块,JsonGenerator和JsonParser,还有一块部分是JsonToken