Streaming API将JSON内容作为离散事件进行读写. JsonParser读取数据,而JsonGenerator写入数据.它是三者中最强大的方法,具有最低的开销和最快的读/写操作.它是Analogus to Stax解析器的XML.
在本文中,我们将展示使用Jackson流API来读写JSON数据. Streaming API与令牌的概念一起使用,Json的每个细节都要谨慎处理.以下是我们将在示例中使用的两个类:
JsonGenerator - 写入JSON字符串.
JsonParser - 解析JSON字符串.
使用JsonGenerator编写JSON
使用JsonGenerator非常简单.首先使用JsonFactory.createJsonGenerator()方法创建JsonGenerator并使用它的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");
让我们看看JsonGenerator的运作情况.在 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(); MapdataMap = 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]