在 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数组将被一一处理。
我在 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数组将被一一处理。