GSON-JsonReader

时间:2020-01-09 10:36:11  来源:igfitidea点击:

GSONJsonReader是GSON流JSON解析器。 GSONJsonReader使我们可以读取JSON字符串或者文件作为JSON令牌流。

为令牌迭代JSON令牌也称为通过JSON令牌进行流式传输。这就是为什么有时将GSONJsonReader也称为流JSON解析器的原因。

流解析器通常有两种版本:拉式解析器和推式解析器。拉式解析器是一种解析器,当代码准备处理下一个标记时,使用它的代码会将标记从解析器中拉出。推送解析器解析JSON令牌,并将其推送到事件处理程序中。 GSONJsonReader是拉式解析器。

在本GSONJsonReader教程中,我们将仔细研究这意味着什么以及JsonReader的工作原理。

创建一个GSON JsonReader

我们可以这样创建一个GSONJsonReader

String json = "{\"brand\" : \"Toyota\", \"doors\" : 5}";

JsonReader jsonReader = new JsonReader(new StringReader(json));

请注意,JsonReader构造函数如何将Java Reader作为参数。在上面的示例中,我们将Java StringReader传递给JsonReader的构造函数。 " StringReader"能够将Java字符串"转换"为字符流(换句话说就是" Reader")。

迭代JsonReader的JSON令牌

一旦创建了JsonReader实例,我们就可以遍历它从传递给JsonReader构造函数的Reader中读取的JSON令牌。

迭代JsonReader的JSON令牌的主要外观如下所示:

while(jsonReader.hasNext() {

}

如果JsonReader具有更多标记,``JsonReaderhasNext()方法将返回true`。

要访问JsonReader的令牌,请使用类似于以下内容的循环:

String json = "{\"brand\" : \"Toyota\", \"doors\" : 5}";

JsonReader jsonReader = new JsonReader(new StringReader(json));

try {
    while(jsonReader.hasNext()){
        JsonToken nextToken = jsonReader.peek();
        System.out.println(nextToken);

        if(JsonToken.BEGIN_OBJECT.equals(nextToken)){

            jsonReader.beginObject();

        } else if(JsonToken.NAME.equals(nextToken)){

            String name  =  jsonReader.nextName();
            System.out.println(name);

        } else if(JsonToken.STRING.equals(nextToken)){

            String value =  jsonReader.nextString();
            System.out.println(value);

        } else if(JsonToken.NUMBER.equals(nextToken)){

            long value =  jsonReader.nextLong();
            System.out.println(value);

        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

JsonReaderpeek()方法将返回下一个JSON令牌,但不会移至下一个JSON令牌。随后多次调用peek()将返回相同的JSON令牌。

可以将peek()返回的JsonTokenJsonToken类中的常量进行比较,以找出它是什么类型的令牌。我们可以在上面的循环中看到完成的操作。

在每个" if"语句中,将调用" JsonReader"方法,该方法将" JsonReader"移至当前令牌上,并移至下一个令牌。所有的beginObject(),nextString()和nextLong()返回当前令牌的值,并将内部指针移到下一个。