每天記錄學習的新知識 :JsonReader

參考地址

參考地址: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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章