每天记录学习的新知识 :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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章