Jackson - Streaming(流式) API

  • 简述

    流式处理 API 将 JSON 内容作为离散事件进行读取和写入。JsonParser 读取数据,而 Json生成器写入数据。它是三者中最强大的方法,开销最低,读/写操作速度最快。它类似于用于 XML 的斯塔克斯解析器。
    在本文中,我们将演示如何使用杰克逊流式处理 API 来读取和写入 JSON 数据。流式处理API与令牌的概念一起使用,Json的每个细节都要小心处理。以下是我们将在示例中使用的两个类:
  • 使用 JsonGenerator 编写 JSON

    使用 Json 生成器非常简单。首先使用 JsonFactory.createJsonGenerator() 方法创建 Json 生成器,然后使用它的 write***() 方法来写入每个 json 值。
    
    JsonFactory jsonFactory = new JsonFactory();
    JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File(
       "student.json"), JsonEncoding.UTF8);
    // {
    jsonGenerator.writeStartObject();
    // "name" : "Mahesh Kumar"
    jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
    
    让我们看看 Json 生成器的实际应用。在 C:\>Jackson_WORKSPACE 中创建一个名为“JacksonTester”的 Java 类文件。
    文件: JacksonTester.java
    import java.io.File;
    import java.io.IOException;
    import java.util.Map;
    import com.fasterxml.jackson.core.JsonEncoding;
    import com.fasterxml.jackson.core.JsonFactory;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    public class JacksonTester {
       public static void main(String args[]){
          try {         
             JsonFactory jsonFactory = new JsonFactory();
             JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File("student.json"), JsonEncoding.UTF8);
             jsonGenerator.writeStartObject();
             // "name" : "Mahesh Kumar"
             jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
             // "age" : 21
             jsonGenerator.writeNumberField("age", 21);
             // "verified" : false
             jsonGenerator.writeBooleanField("verified", false);
             // "marks" : [100, 90, 85]
             jsonGenerator.writeFieldName("marks"); 
             // [
             jsonGenerator.writeStartArray(); 
             // 100, 90, 85
             jsonGenerator.writeNumber(100); 
             jsonGenerator.writeNumber(90); 
             jsonGenerator.writeNumber(85); 
             // ]
             jsonGenerator.writeEndArray(); 
             jsonGenerator.writeEndObject(); 
             jsonGenerator.close();        
             //result student.json
             //{ 
             //   "name":"Mahesh Kumar",
             //   "age":21,
             //   "verified":false,
             //   "marks":[100,90,85]
             //}
             ObjectMapper mapper = new ObjectMapper();
             Map<String,Object> dataMap = mapper.readValue(new File("student.json"), Map.class);
             System.out.println(dataMap.get("name"));
             System.out.println(dataMap.get("age"));
             System.out.println(dataMap.get("verified"));
             System.out.println(dataMap.get("marks"));
          } 
          catch (JsonParseException e) { e.printStackTrace(); } 
          catch (JsonMappingException e) { e.printStackTrace(); } 
          catch (IOException e) { e.printStackTrace(); }
       }
    }
    
    
    验证结果
    使用 javac 编译器编译类,如下所示:
    
    C:\Jackson_WORKSPACE>javac JacksonTester.java
    
    现在运行 JacksonTester 以查看结果:
    
    C:\Jackson_WORKSPACE>java JacksonTester
    
    验证输出
    
    Mahesh Kumar
    21
    false
    [100, 90, 85]
    
  • 使用 JsonParser 读取 JSON

    使用 JsonParser 再次非常简单。首先使用 JsonFactory.createJsonParser() 方法创建 JsonParser,然后使用它的 nextToken() 方法将每个 json 字符串作为令牌读取。检查每个令牌并相应地进行处理
    
    JsonFactory jasonFactory = new JsonFactory();
    JsonParser jsonParser = jasonFactory.createJsonParser(new File("student.json"));
    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
       //get the current token
       String fieldname = jsonParser.getCurrentName();
       if ("name".equals(fieldname)) {
          //move to next token
          jsonParser.nextToken();
          System.out.println(jsonParser.getText());          
       }
    }
    
    让我们看看 JsonParser 的实际应用。在 C:\>Jackson_WORKSPACE 中创建一个名为“JacksonTester”的 Java 类文件。
    文件: JacksonTester.java
    import java.io.File;
    import java.io.IOException;
    import java.util.Map;
    import com.fasterxml.jackson.core.JsonEncoding;
    import com.fasterxml.jackson.core.JsonFactory;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    public class JacksonTester {
       public static void main(String args[]){
          JacksonTester tester = new JacksonTester();
          try {         
             JsonFactory jsonFactory = new JsonFactory();
             JsonGenerator jsonGenerator = jsonFactory.createGenerator(new File(
                "student.json"), JsonEncoding.UTF8);
             jsonGenerator.writeStartObject();
             jsonGenerator.writeStringField("name", "Mahesh Kumar"); 
             jsonGenerator.writeNumberField("age", 21);
             jsonGenerator.writeBooleanField("verified", false); 
             jsonGenerator.writeFieldName("marks"); 
             jsonGenerator.writeStartArray(); // [
             jsonGenerator.writeNumber(100); 
             jsonGenerator.writeNumber(90); 
             jsonGenerator.writeNumber(85); 
             jsonGenerator.writeEndArray(); 
             jsonGenerator.writeEndObject(); 
             jsonGenerator.close();          
             //result student.json
             //{ 
             //   "name":"Mahesh Kumar",
             //   "age":21,
             //   "verified":false,
             //   "marks":[100,90,85]
             //}
             JsonParser jsonParser = jsonFactory.createParser(new File("student.json"));
             while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                //get the current token
                String fieldname = jsonParser.getCurrentName();
                if ("name".equals(fieldname)) {
                   //move to next token
                   jsonParser.nextToken();
                   System.out.println(jsonParser.getText());             
                }
                if("age".equals(fieldname)){
                   //move to next token
                   jsonParser.nextToken();
                   System.out.println(jsonParser.getNumberValue());          
                }
                if("verified".equals(fieldname)){
                   //move to next token
                   jsonParser.nextToken();
                   System.out.println(jsonParser.getBooleanValue());             
                }
                if("marks".equals(fieldname)){
                   //move to [ 
                   jsonParser.nextToken();
                   // loop till token equal to "]"
                   while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
                      System.out.println(jsonParser.getNumberValue()); 
                   }
                }
             }
          } catch (JsonParseException e) {
             e.printStackTrace();
          } catch (JsonMappingException e) {
             e.printStackTrace();
          } catch (IOException e) {
             e.printStackTrace();
          }
       }
    }
    
    
    验证结果
    使用 javac 编译器编译类,如下所示:
    
    C:\Jackson_WORKSPACE>javac JacksonTester.java
    
    现在运行 JacksonTester 以查看结果:
    
    C:\Jackson_WORKSPACE>java JacksonTester
    
    验证输出
    
    Mahesh Kumar
    21
    false
    [100, 90, 85]