我一直在关注Gson Library的Streaming实现。但是我无法确定像下面那样获取数组的第一个元素是否是一个好习惯。 URL返回包含Json数组的InputStream
。
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
reader.beginArray();
Message message = new gson().fromJson(reader, Message.class);
reader.endArray(); // this line
reader.close();
我的问题在于旁边有评论的行。如果我只想获得第一个元素,我应该这样做吗?
请注意,我想知道代码的效率。代码直接从gson流示例中复制[通过一些修改来正确描述情况]。
实际数组非常大。这就是为什么我不能等待获得整个数组然后获得元素。所以我想在获得第一个元素然后关闭流后立即中断该过程。
如果有任何更好的方法,请向我推荐。
答案 0 :(得分:2)
请注意,我想知道代码的效率
那么,看看代码:) Source for JsonReader
它几乎可以满足您的期望。它使用提供的InputStreamReader
并且只读取完成操作所需的内容(在您的情况下,从JSON数组中获取第一个对象)。
然而......当你打电话给endArray()
时......它会从流中读取,直到找到该数组的结束]
。你实际上并不关心这一点,当然也不想花时间从线上读取所有数据。只需致电close()
。
因为你正在关闭JsonReader
(以及基础流)......这就像你将获得的一样好。您只能从基础流中读取所需数据,然后将其关闭。
根据评论进行修改:您可以通过以下方式让您的案例变得干净整洁:
public Message getFirstMessageFromArray(JsonReader reader) {
reader.beginArray();
return getMessageFromJson(reader);
}
public Message getMessageFromJson(JsonReader reader) {
return new gson().fromJson(reader, Message.class);
}
当你想要使用它时:
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
Message message = getFirstMessageFromArray(reader);
reader.close();
或
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
Message message = getMessageFromJson(reader);
reader.close();