我一直在寻找Gson流媒体API代码的例子,我看到了很多这样的风格:
reader.beginObject();
while (reader.hasNext()) {
switch(reader.peek()) {
case NAME:
...
case BEGIN_ARRAY:
...
case END_ARRAY:
...
}
reader.endObject();
reader.close();
当JSON只有一个“顶层”对象时,这段代码非常有效。hasNext()循环终止于第一个对象的末尾。我需要一个循环来处理所有对象。下面是我的JSON的一个简短示例:
{
"meta": {
"disclaimer": "Loren Ipsum",
"terms": "https://myURL/terms/",
"license": "https://myURL/license/",
"last_updated": "2023-03-10",
"totals": {
"skip": 0,
"limit": 12000,
"total": 362818
}
},
"results": [
{"result": "value1"},
{"result": "value2"},
{"result": "value3"},
]
}
这段代码很好地处理了“ meta”对象,但从未到达“results”数组。
到处找。
1条答案
按热度按时间m1m5dgzv1#
在使用
peek()
时,通常不必处理NAME
和END_ARRAY
:hasNext()
,当结果为true时调用nextName()
,然后是一个值阅读方法,比如nextInt()
(可能是先用peek()
检查类型)。hasNext()
,则在循环中不会遇到END_ARRAY
。从
JsonReader
阅读JSON数组和对象的一般结构是:你可以任意嵌套它。下面是一个例子,基于你的JSON数据。这个例子的重点是演示嵌套,代码不是很有用,也很冗长:
但是,在您的用例中是否真的有必要直接从
JsonReader
读取数据呢?如果没有必要,那么只创建与JSON数据匹配的模型类可能会更少出错(例如class Meta { String disclaimer; URL terms; ... }
),并使用Gson.fromJson
方法之一,将Reader
作为参数。在内部,它也将以流的方式解析JSON,所以唯一的开销是,之后完整的反序列化对象存在于内存中。2但也许这正是你所需要的。