参考地址
参考地址:JsonReader 使用方法
参考地址:Gson JsonReader使用讲解
JsonReader
JsonReader是一种解析器,他可以解析流,数组,Bean等Json数据。
API简介
英译汉~
方法 | 用途 |
---|---|
void beginArray() | 使用JSON流中的下一个标记并断言它是新数组的开始 |
void beginObject() | 使用JSON流中的下一个标记并断言它是新对象的开始 |
void close() | 关闭这个JSON阅读器和底层阅读器 |
void endArray() | 使用JSON流中的下一个标记并断言它是当前数组的末尾 |
void endObject() | 使用JSON流中的下一个标记并断言它是当前对象的末尾 |
boolean hasNext() | 如果当前数组或对象有另一个元素(JsonReader有更多的标记),则返回true |
boolean isLenient() | 如果解析器接受的内容是自由的,则返回true |
boolean nextBoolean() | 返回下一个标记的布尔值,并使用它 |
double nextDouble() | 返回下一个标记的double值,并使用它 |
int nextInt() | 返回下一个标记的int值,并使用它 |
long nextLong() | 返回下一个标记的long值,并使用它 |
String nextName() | 返回下一个标记(密钥名称)并使用它 |
void nextNull() | 使用JSON流中的下一个标记,并断言它是文字null |
String nextString() | 返回下一个标记的字符串值,并使用它 |
JsonToken peek() | 返回下一个令牌的类型,而不使用它 |
void setLenient(boolean lenient) | 将此解析器配置为自由地接受内容 |
void skipValue() | 递归跳过下一个值 |
String toString() | 返回一个字符串,该字符串包含对该对象的简明的、人类可读的描述 |
解析前
数据被封装,例1:StringReader
jsonData =
{
"name":"yoshin"
}
StringReader in = new StringReader(jsonData)
JsonReader 解析的数据必须是被封装Reader,根据数据来源可以区分:
- BufferedReader
- LineNumberReader
- CharArrayReader
- InputStreamReader
- FileReader
- FilterReader
- PushbackReader
- PipedReader
- StringReader
这样,我们的JsonReader才可以使用它。
例2:InputStreamReader
InputStream is = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("com/vince/json/names.json");
InputStreamReader in = new InputStreamReader(is);
使用:
JsonReader reader = new JsonReader(in);
解析
解析Object
public static void parseResponse() {
String json = "{'key1': 1,'key2': 'name is xiaoming','key3': 'age is 4','key4': null}";
JsonReader jsonReader = new JsonReader(new StringReader(json));
jsonReader.setLenient(true);
try {
jsonReader.beginObject();
while (jsonReader.hasNext()) {
JsonToken nextToken = jsonReader.peek();
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 {
System.out.println("ELSE ---> NULL ");
}
}
jsonReader.endObject();
jsonReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
调用后输出:
I/System.out: Token Key ---> key1
I/System.out: Token Value ---> 1
I/System.out: Token Key ---> key2
I/System.out: Token Value ---> name is xiaoming
I/System.out: Token Key ---> key3
I/System.out: Token Value ---> age is 4
I/System.out: Token Key ---> key4
I/System.out: Token Value ---> NULL
解析数组
private void parseResponse() throws IOException {
String json2 = "{'list':[{'key1': 1,'key2': 'name is xiaoming','key3': 'age is 4','key4': null},
{'key5': 1,'key6': 'name is xiaoming','key7': 'age is 4','key8': null}]}";
JsonReader reader = new JsonReader(new StringReader(json2));
reader.setLenient(true);
reader.beginObject();
while (reader.hasNext()) {
String key = reader.nextName();
if (key.equals("list")) {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
while (reader.hasNext()) {
JsonToken nextToken = reader.peek();
if (JsonToken.NAME.equals(nextToken)) {
String name = reader.nextName();
System.out.println("Token Key ---> " + name);
} else if (JsonToken.STRING.equals(nextToken)) {
String value = reader.nextString();
System.out.println("Token Value ---> " + value);
} else if (JsonToken.NUMBER.equals(nextToken)) {
long value = reader.nextLong();
System.out.println("Token Value ---> " + value);
} else if (JsonToken.NULL.equals(nextToken)) {
reader.nextNull();
System.out.println("Token Value ---> NULL ");
} else if (JsonToken.END_OBJECT.equals(nextToken)) {
reader.endObject();
System.out.println("endObject");
} else {
reader.skipValue();
}
}
reader.endObject();
}
reader.endArray();
} else {
reader.skipValue();
}
}
reader.endObject();
reader.close();
}
调用后输出:
I/System.out: Token Key ---> key1
I/System.out: Token Value ---> 1
I/System.out: Token Key ---> key2
I/System.out: Token Value ---> name is xiaoming
I/System.out: Token Key ---> key3
I/System.out: Token Value ---> age is 4
I/System.out: Token Key ---> key4
I/System.out: Token Value ---> NULL
I/System.out: Token Key ---> key5
I/System.out: Token Value ---> 1
I/System.out: Token Key ---> key6
I/System.out: Token Value ---> name is xiaoming
I/System.out: Token Key ---> key7
I/System.out: Token Value ---> age is 4
I/System.out: Token Key ---> key8
I/System.out: Token Value ---> NULL