Gson 流

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 ]

下一节:gson 序列化示例

gson 教程

相关文章