Streaming API用于通过令牌读取JSON令牌.它将JSON内容读写为离散事件. JsonReader 和 JsonWriter 读取/写入数据作为标记,称为 JsonToken .
这是处理JSON的三种方法中最强大的方法.它具有最低的开销,并且在读/写操作中非常快.它类似于XML的Stax解析器.
在本章中,我们将展示使用GSON流API来读取JSON数据. Streaming API与token的概念一起使用,Json的每个细节都要小心处理.
//create JsonReader object and pass it the json source or json text. JsonReader reader = new JsonReader(new StringReader(jsonString)); //start reading json reader.beginObject(); //get the next token JsonToken token = reader.peek(); //check the type of the token if (token.equals(JsonToken.NAME)) { //get the current token fieldname = reader.nextName(); }
让我们看看 JsonReader 的运作情况.在C:\> GSON_WORKSPACE中创建名为 GsonTester 的Java类文件.
import java.io.IOException; import java.io.StringReader; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; public class GsonTester { public static void main(String args[]) { String jsonString = "{name:Mahesh Kumar, age:21,verified:false,marks: [100,90,85]}"; JsonReader reader = new JsonReader(new StringReader(jsonString)); try { handleJsonObject(reader); } catch (IOException e) { e.printStackTrace(); } } private static void handleJsonObject(JsonReader reader) throws IOException { reader.beginObject(); String fieldname = null; while (reader.hasNext()) { JsonToken token = reader.peek(); if (token.equals(JsonToken.BEGIN_ARRAY)) { System.out.print("Marks [ "); handleJsonArray(reader); System.out.print("]"); } else if (token.equals(JsonToken.END_OBJECT)) { reader.endObject(); return; } else { if (token.equals(JsonToken.NAME)) { //get the current token fieldname = reader.nextName(); } if ("name".equals(fieldname)) { //move to next token token = reader.peek(); System.out.println("Name: "+reader.nextString()); } if("age".equals(fieldname)) { //move to next token token = reader.peek(); System.out.println("Age:" + reader.nextInt()); } if("verified".equals(fieldname)) { //move to next token token = reader.peek(); System.out.println("Verified:" + reader.nextBoolean()); } } } } private static void handleJsonArray(JsonReader reader) throws IOException { reader.beginArray(); String fieldname = null; while (true) { JsonToken token = reader.peek(); if (token.equals(JsonToken.END_ARRAY)) { reader.endArray(); break; } else if (token.equals(JsonToken.BEGIN_OBJECT)) { handleJsonObject(reader); } else if (token.equals(JsonToken.END_OBJECT)) { reader.endObject(); } else { System.out.print(reader.nextInt() + " "); } } } }
使用 javac 编译器编译类如下 :
C:\ GSON_WORKSPACE> javac GsonTester.java
现在运行 GsonTester 查看结果 :
C:\ GSON_WORKSPACE> java GsonTester
验证输出.
Name: Mahesh Kumar Age:21 Verified:false Marks [ 100 90 85 ]