每天记录学习的新知识 :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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风徐来辽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值