原文: 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处理它时,每个令牌将被顺序处理。 例如,

  1. {
  2. "name":"Lokesh"
  3. }

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

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

3.如何创建 GSON JsonReader

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

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

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

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

4.读取 JSON 流

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

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

  1. import java.io.IOException;
  2. import java.io.StringReader;
  3. import com.google.gson.stream.JsonReader;
  4. import com.google.gson.stream.JsonToken;
  5. public class Main
  6. {
  7. public static void main(String[] args) throws Exception
  8. {
  9. String json = "{'id': 1001,'firstName': 'Lokesh','lastName': 'Gupta','email': null}";
  10. JsonReader jsonReader = new JsonReader(new StringReader(json));
  11. jsonReader.setLenient(true);
  12. try
  13. {
  14. while (jsonReader.hasNext())
  15. {
  16. JsonToken nextToken = jsonReader.peek();
  17. if (JsonToken.BEGIN_OBJECT.equals(nextToken)) {
  18. jsonReader.beginObject();
  19. } else if (JsonToken.NAME.equals(nextToken)) {
  20. String name = jsonReader.nextName();
  21. System.out.println("Token KEY >>>> " + name);
  22. } else if (JsonToken.STRING.equals(nextToken)) {
  23. String value = jsonReader.nextString();
  24. System.out.println("Token Value >>>> " + value);
  25. } else if (JsonToken.NUMBER.equals(nextToken)) {
  26. long value = jsonReader.nextLong();
  27. System.out.println("Token Value >>>> " + value);
  28. } else if (JsonToken.NULL.equals(nextToken)) {
  29. jsonReader.nextNull();
  30. System.out.println("Token Value >>>> null");
  31. } else if (JsonToken.END_OBJECT.equals(nextToken)) {
  32. jsonReader.endObject();
  33. }
  34. }
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. } finally {
  38. jsonReader.close();
  39. }
  40. }
  41. }
  1. Token KEY >>>> id
  2. Token Value >>>> 1001
  3. Token KEY >>>> firstName
  4. Token Value >>>> Lokesh
  5. Token KEY >>>> lastName
  6. Token Value >>>> Gupta
  7. Token KEY >>>> email
  8. 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 文档