Gson - JsonReader

Gson - JsonReader

原文: https://howtodoinjava.com/gson/jsonreader-streaming-json-parser/

了解如何使用 Gson JsonReader类,该类是基于请求的流式 JSON 解析器。 它有助于将 JSON 作为令牌流读取。

1. JsonReader

  • JsonReader是流 JSON 解析器,并且是拉式解析器的示例。 推送解析器解析 JSON 令牌并将其推送到事件处理器中。
  • 它有助于读取 JSON(RFC 7159)编码的值作为令牌流。
  • 它读取字面值(字符串,数字,布尔值和null)以及对象和数组的开始和结束定界符。
  • 令牌以深度优先顺序遍历,与 JSON 文档中出现的顺序相同。

阅读更多: XML 的流解析器

2.令牌

在流模式下,每个 JSON 数据都被视为一个单独的令牌。 当我们使用JsonReader处理它时,每个令牌将被顺序处理。 例如,

{
	"name":"Lokesh"
}

在使用JsonReader进行解析时,上述 JSON 将生成 4 个令牌:

  • 令牌 1 = {
  • 令牌 2 = name
  • 令牌 3 = Lokesh
  • 令牌 4 = }

3.如何创建 GSON JsonReader

我们可以使用它的简单构造器创建一个JsonReader实例,该实例接受java.io.Reader类型的输入流。

String json = "{}";
JsonReader jsonReader = new JsonReader( new StringReader(json) );

我们可以根据 JSON 流的来源使用以下阅读器之一:

  • BufferedReader
  • LineNumberReader
  • CharArrayReader
  • InputStreamReader
  • FileReader
  • FilterReader
  • PushbackReader
  • PipedReader
  • StringReader

4.读取 JSON 流

在创建包装了有效 JSON 源的JsonReader之后,我们可以开始对流令牌进行迭代并查看令牌值。

以下是在令牌上使用JsonReader读取简单 JSON 的示例。

import java.io.IOException;
import java.io.StringReader;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

public class Main 
{
	public static void main(String[] args) throws Exception 
	{

		String json = "{'id': 1001,'firstName': 'Lokesh','lastName': 'Gupta','email': null}";

		JsonReader jsonReader = new JsonReader(new StringReader(json));
		jsonReader.setLenient(true);

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

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

					jsonReader.beginObject();

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

					String name = jsonReader.nextName();
					System.out.println("Token KEY >>>> " + name);

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

					String value = jsonReader.nextString();
					System.out.println("Token Value >>>> " + value);

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

					long value = jsonReader.nextLong();
					System.out.println("Token Value >>>> " + value);

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

					jsonReader.nextNull();
					System.out.println("Token Value >>>> null");

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

					jsonReader.endObject();

				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			jsonReader.close();
		}
	}
}

Token KEY >>>> id
Token Value >>>> 1001

Token KEY >>>> firstName
Token Value >>>> Lokesh

Token KEY >>>> lastName
Token Value >>>> Gupta

Token KEY >>>> email
Token Value >>>> null

在上面的示例中:

  • JsonReaderhasNext()方法如果有更多令牌,则返回true
  • peek()方法返回下一个 JSON 令牌,但不移至下一个。
  • 随后,多次调用peek()将返回相同的 JSON 令牌。
  • 可以使用JsonToken类的常量检查返回令牌的类型。
  • 使用beginArray()endArray()方法检查数组的左括号'['']'
  • 使用beginObject()endObject()方法检查对象的左括号'{''}'

令牌的密钥的类型为JsonToken.NAME。 使用nextName()方法获取密钥名称。

  • 确定令牌类型后,使用nextLong()nextString()nextInt()等方法获取令牌的值。
  • 可以使用nextNull()skipValue()使用空字面值。
  • 所有next....()方法都返回当前令牌的值,并将内部指针移到下一个。
  • 当遇到未知名称时,严格的解析器应该失败,并带有异常。 宽松解析器应调用skipValue()来递归地跳过该值的嵌套令牌,否则可能会发生冲突。

将有关 Gson JsonReader的问题交给我。

学习愉快!

参考:

Gson 用户指南

JsonReader Java 文档