GSON-JsonReader
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
具有更多标记,``JsonReader的
hasNext()方法将返回
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()
返回的JsonToken
与JsonToken
类中的常量进行比较,以找出它是什么类型的令牌。我们可以在上面的循环中看到完成的操作。
在每个" if"语句中,将调用" JsonReader"方法,该方法将" JsonReader"移至当前令牌上,并移至下一个令牌。所有的beginObject(),nextString()和nextLong()返回当前令牌的值,并将内部指针移到下一个。