Gson 流
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(); }
1. 范例
让我们看看 JsonReader的运作 情况。在C:> GSON_WORKSPACE中创建名为 GsonTester 的Java类文件。
文件: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() + " "); } } } }
2. 验证结果
使用 javac 编译器编译类如下:
C:\GSON_WORKSPACE>javac GsonTester.java
现在运行 GsonTester 查看结果:
C:\GSON_WORKSPACE>java GsonTester
验证输出。
Name: Mahesh Kumar Age:21 Verified:false Marks [ 100 90 85 ]
在本章中,我们将讨论数组,集合和泛型的序列化/反序列化。 1. 数组示例int[] marks = {100,90,85};//SerializationSystem.out.println("marks:" ...