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