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 ]


