Gson 流

Streaming API用于通过令牌读取 JSON 令牌。它将 JSON 内容读写为离散事件。 JsonReaderJsonWriter 将数据读/写为令牌,称为 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 ]

下一章:Gson 序列化示例

在本章中,我们将讨论数组,集合和泛型的序列化/反序列化。 1. 数组示例int[] marks = {100,90,85};//SerializationSystem.out.println("marks:" ...