学习使用Gson JsonReader类,这是一个基于拉的流式JSON解析器,它有助于将JSON作为标记流来读取
1. JsonReader是什么
JsonReader
是流式JSON解析器和拉解析器的示例。推送解析器解析JSON令牌并将它们推送到事件处理程序中。- 它有助于将JSON(RFC 7159)编码值作为标记流读取。
- 它读取文字值(字符串,数字,布尔值和空值)以及对象和数组的开始和结束分隔符。
- 标记以深度优先顺序遍历,与它们在JSON文档中出现的顺序相同。
2. Tokens
在流模式下,每个JSON数据都被视为单个令牌。当我们用
JsonReader
它来处理它时,每个令牌将按顺序处理。例如,
$title(Json Tokens)
{
"name":"Lokesh"
}
在使用JsonReader进行解析时,上面的JSON将生成4个token:
- Token 1 = {
- Token 2 = name
- Token 3 = Lokesh
- Token 4 = }
3.如何创建GSON JsonReader
我们可以JsonReader
使用它接受java.io.Reader
类型输入流的简单构造函数创建一个实例。
$title(Create JsonReader)
String json = "{}";
JsonReader jsonReader = new JsonReader( new StringReader(json) );
我们可以根据JSON流的来源使用以下读者之一:
BufferedReader
LineNumberReader
CharArrayReader
InputStreamReader
FileReader
FilterReader
PushbackReader
PipedReader
StringReader
4.读取JSON Stream
在创建JsonReader
包装有效的JSON源之后,我们可以开始迭代流令牌并查看令牌值。
以下是在令牌上使用表单中的JsonReader读取简单JSON的示例。
$title(JsonReader Example)
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
在上面的例子中:
令牌的键是JsonToken.NAME类型。使用nextName()
方法获取密钥名称。
- 如果hasNext()方法
JsonReader
有更多的标记,则返回true 的hasNext()方法。 - 的PEEK()方法返回下一个令牌JSON,但不移动在它。
- 对
peek()
随后的多次调用将返回相同的JSON令牌。 - 可以使用
JsonToken
类的常量检查返回标记的类型。 - Array的开启和关闭括号
'['
,并']'
与检查beginArray()和endArray()方法。 - Object的开始和结束括号
'{'
,'}'
并使用beginObject()和endObject()方法进行检查。 - 确定令牌的类型后,获得令牌的使用方法的类似的值
nextLong()
,nextString()
,nextInt()
等。 - 空文字可以使用任何消耗
nextNull()
或skipValue()
。 - 所有
next....()
方法都返回当前标记的值,并将内部指针移动到下一个标记。 - 遇到未知名称时,严格的解析器应该失败并出现异常。宽松解析器应该调用
skipValue()
以递归方式跳过值的嵌套标记,否则可能会发生冲突。
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/243648.html