參考地址
參考地址: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