2013-06-28 116 views
0

我一直在寻找Gson库的Streaming实现。但我无法确定是否会像下面这样做一个好的习惯来获得数组的第一个元素。该URL返回一个包含Json数组的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流示例中复制[有一些修改来正确描述情况]。

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

另外,如果有任何问题,请推荐我任何更好的方法。

回答

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(); 
+0

谢谢...真的帮了我很多。所以这意味着如果我只是打电话关闭,它会做我的工作...... – Writwick

+0

是的。你已经有了'MessageObject',在那之后调用'reader.close()'并且继续你的快乐方式。 –

+0

好的,现在在下一个序列中,我只收到一个“MessageObject”而不是数组。我应该如何处理它?简单的'gson.fromJson(...)'会很好吗? – Writwick

相关问题