在 Java 中逐行读取大型 JSON 文件的快速高效方法

Fast & Efficient Way To Read Large JSON Files Line By Line in Java

我在 JSON 文件中有 1 亿条记录,需要一种高效且最快的方法来从 java 中的 JSON 文件中读取数组数组。

JSON 文件看起来像:

[["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
 ["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
 ...
 ...
 ...
 ,["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"]]

我想逐行阅读此 JSON 文件:

先阅读:

["XYZ",...,"ABC"]

然后:

["XYZ",...,"ABC"]

等等:'

...
...
...
["XYZ",...,"ABC"]

如何读取这样的 JSON 文件,我知道它看起来并不完全像 JSON 文件,但我需要以这种格式读取此文件,该格式保存 as.JSON

您可以使用 JSON Processing API (JSR 353),以流方式处理您的数据:

import javax.json.Json;
import javax.json.stream.JsonParser;

...

String dataPath = "data.json";

try(JsonParser parser = Json.createParser(new FileReader(dataPath))) {
     List<String> row = new ArrayList<>();

     while(parser.hasNext()) {
         JsonParser.Event event = parser.next();
         switch(event) {
             case START_ARRAY:
                 continue;
             case VALUE_STRING:
                 row.add(parser.getString());
                 break;
             case END_ARRAY:
                 if(!row.isEmpty()) {
                     //Do something with the current row of data 
                     System.out.println(row);

                     //Reset it (prepare for the new row) 
                     row.clear();
                 }
                 break;
             default:
                 throw new IllegalStateException("Unexpected JSON event: " + event);
         }
     }
}

您可以使用 JsonSurfer 通过 Json 路径提取所有内部 JSON 数组:$[*]

    JsonSurfer surfer = JsonSurferJackson.INSTANCE;
    surfer.configBuilder().bind("$[*]", new JsonPathListener() {
        @Override
        public void onValue(Object value, ParsingContext context) {
            System.out.println(value);
        }
    }).buildAndSurf(json);

它不会将整个 Json 加载到内存中。 JSON数组将被一一处理。