Gson-数据流API

1 什么是StreamingAPI

StreamingAPI用于通过令牌读取JSON令牌。它读取和写入JSON内容作为离散事件。JsonReader和JsonWriter作为令牌读取/写入数据,称为JsonToken。

它是处理JSON的三种方法中最强大的方法。它具有最低的开销,并且在读/写操作中相当快。它类似于Stax XML解析器。

2 StreamingAPI的语法

//创建JsonReader对象JsonReader reader = new JsonReader(new StringReader(jsonString));  

//开始读取json数据  
reader.beginObject(); 

//获取下一个令牌
JsonToken token = reader.peek(); 

//检查令牌类型
if (token.equals(JsonToken.NAME)) {     
   //get the current token 
   fieldname = reader.nextName(); 
}

3 StreamingAPI的示例

3.1 编写核心类

MainApp:

package com.yiidian.gson;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.IOException;
import java.io.StringReader;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class MainApp {

    public static void main(String args[]) {

        String jsonString =
                "{\"name\":\"eric\", \"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() + " ");
            }
        }
    }
}

3.2 运行测试