我的要求是阅读一个巨大的JSON文档,如下所示。但是,我对文档的某些部分不感兴趣,只对我想反序列化并作为实体持久化的对象数组感兴趣。我目前正在使用Gson库,我的意图不是将整个数组加载到内存中,而是将它们作为一个流解析为一个流。
我的JSON文档如下所示:
{
"header":{
..........
..........
},
"data": [{},{},{}.......]
"trailer":{
}
}
假设上述JSON表示一个名为Document的对象
public class Documemt{
private Header header;
private Data[] data;
private Trailer trailer;
}
我感兴趣的是数据[]
我开始做以下事情
InputStream is = Sample.class.getResourceAsStream("/SampleJSON.json");
JsonReader reader = new JsonReader(new InputStreamReader(is));
reader.beginObject();
while(reader.hasNext()){
//At this point, I'm having issues.
gson.fromJson(reader,Document.class); //This will load the entire document into memory. which I do not want.
}
reader.endObject();
是否可以跳过Header和Trailer,并将Data []对象创建为流。
类似
if token == header || token==trailer then
skip
else
Stream<Data> data = jsonReader.read
任何此类要求的指针或示例。
谢谢
答案 0 :(得分:0)
我不确定我的方法是否正确,但是我获得了如下结果
Gson gson = new Gson();
InputStream is = Sample.class.getResourceAsStream("/SampleJSON.json");
JsonReader reader = new JsonReader(new InputStreamReader(is));
reader.beginObject();
while(reader.hasNext()){
String tokenName = reader.nextName();
if("header".equals(tokenName) || "trailer".equals(tokenName)){
reader.skipValue();
continue;
}
reader.beginArray();
while(reader.hasNext()){
Data data = gson.fromJson(reader, Data.class);
System.out.println(data);
count++;
}
reader.endArray();
}
reader.endObject();
System.out.println("Count ->"+count);
我的解决方案是否存在缺陷?是否有更好的替代方法?
答案 1 :(得分:0)
您目前处在正确的轨道上,但是有一种更简便的方法来实现此目的。
只需声明仅包含DTO
的{{1}}类,例如:
Data[]
然后您的public class DataOnlyDocument {
private Data[] data;
}
可以是:
Reader
Reader r = new InputStreamReader(getClass()
.getClassLoader().getResourceAsStream("/SampleJSON.json"));
将通过以下方式愉快地使用该阅读器:
Gson