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 ]