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