Java Gson:如何在使用流api解析时跳过JSON数组中的行
我试图使用Java Gson:如何在使用流api解析时跳过JSON数组中的行,java,json,gson,jsonstream,Java,Json,Gson,Jsonstream,我试图使用Gson-stream解析一个巨大的JSON数组,其中每次运行,我只需一次处理10个对象 所以在第一次运行时,它会处理10。在第二轮中,它从第11轮开始。第三,从21日开始,以此类推。。。你得到训练 JSON数组的格式为: [ { "key1": "value1"}, { "key2": "value2"}, { "key3": "value3"}, { "key4": "value4"}, .......... ......... ..........
Gson-stream
解析一个巨大的JSON
数组,其中每次运行,我只需一次处理10个对象
所以在第一次运行时,它会处理10。在第二轮中,它从第11轮开始。第三,从21日开始,以此类推。。。你得到训练
JSON数组的格式为:
[
{ "key1": "value1"},
{ "key2": "value2"},
{ "key3": "value3"},
{ "key4": "value4"},
..........
.........
..........
{ "key10": "value10"},
..........
.........
..........
{ "key20": "value20"},
..........
.........
..........
]
我尝试下面的代码,但似乎它没有正常工作,我总是从一开始就解析。这就是我所做的:
public static void readJsonStream(int skipRows) {
JsonReader reader = null;
String FILENAME = "/examples/uh_data.json";
final InputStream stream = UHReportParser.class.getClass().getResourceAsStream(FILENAME);
try {
reader = new JsonReader(new InputStreamReader(stream, "UTF-8"));
Gson gson = new GsonBuilder().create();
// Read file in stream mode
reader.beginArray();
int count = 1;
while (reader.hasNext()) {
if (count++<=skipRows){
continue;
} else if(count>skipRows+10){
break;
}
else{
UserData data = null;
// Read data into object model
data = gson.fromJson(reader, UserData.class); //starts from one again
String description = data.getDescription();
}
}
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
} catch (IOException ex) {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
publicstaticvoidreadjsonstream(int-skipRows){
JsonReader=null;
字符串FILENAME=“/examples/uh_data.json”;
final InputStream stream=UHReportParser.class.getClass().getResourceAsStream(文件名);
试一试{
reader=新的JsonReader(新的InputStreamReader(流,“UTF-8”));
Gson Gson=new GsonBuilder().create();
//以流模式读取文件
reader.beginArray();
整数计数=1;
while(reader.hasNext()){
如果(计数++skipRows+10){
打破
}
否则{
UserData=null;
//将数据读入对象模型
data=gson.fromJson(reader,UserData.class);//再次从一开始
字符串描述=data.getDescription();
}
}
}捕获(不支持DencodingException ex){
例如printStackTrace();
}捕获(IOEX异常){
if(读卡器!=null){
试一试{
reader.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
}
这里应该修改什么?如何才能达到预期的结果?我没有深入分析您的算法,但它似乎没有在“跳过”阶段跳过值,我肯定会重构您的JSON流读取器,以使其尽可能干净(至少就我所能做到的而言)。 这将允许您尽可能多地重用这种方法。 考虑以下方法:
静态无效readArrayBySkipAndLimitFromBegin(最终JsonReader JsonReader、最终整数跳过、最终整数限制、,
最终消费者如何将其全部读取到列表中并在之后进行过滤?似乎您想以任何方式读取所有内容?已编写了一个quartz作业,该作业每天触发一次,每次处理10行。读取整个阵列可能会花费高昂的成本。
[
{"key1": "value1"},
{"key2": "value2"},
...
{"key31": "value31"},
{"key32": "value32"}
]
Step #0: [{key1=value1}, {key2=value2}, {key3=value3}, {key4=value4}, {key5=value5}, {key6=value6}, {key7=value7}, {key8=value8}, {key9=value9}, {key10=value10}]
Step #1: [{key11=value11}, {key12=value12}, {key13=value13}, {key14=value14}, {key15=value15}, {key16=value16}, {key17=value17}, {key18=value18}, {key19=value19}, {key20=value20}]
Step #2: [{key21=value21}, {key22=value22}, {key23=value23}, {key24=value24}, {key25=value25}, {key26=value26}, {key27=value27}, {key28=value28}, {key29=value29}, {key30=value30}]
Step #3: [{key31=value31}, {key32=value32}]
Step #4: []
Done