0

我一直在研究 Gson 库的 Streaming 实现。但是我无法确定执行以下操作来获取数组的第一个元素是否是一个好习惯。该 URL 返回一个InputStream包含 Json 数组的值。

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 流式传输示例中复制[进行了一些修改以正确描述情况]。

实际数组非常大。这就是为什么我不能等待获取整个数组然后获取元素。因此,我想在获得第一个元素后立即中断该过程,然后关闭流。

如果有的话,也请向我推荐任何更好的方法。

4

1 回答 1

2

注意这里我想了解一下代码的效率

好吧,那就看代码吧:)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();
于 2013-06-28T14:31:23.770 回答