JSON
ファイルに1億のレコードがあり、JSON
のJava
ファイルから配列の配列を読み取るための効率的で最速の方法が必要です。
JSON
ファイルは次のようになります:
[["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
...
...
...
,["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"]]
このJSON
ファイルを1行ずつ次のように読みたいと思います。
最初にお読みください:
["XYZ",...,"ABC"]
その後:
["XYZ",...,"ABC"]
など: '
...
...
...
["XYZ",...,"ABC"]
このようなJSON
ファイルを読み取るにはどうすればよいですか。完全にJSON
ファイルのようには見えませんが、.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);
}
}
}
Jackson StreamingAPIをご覧ください。
私はあなたがこのようなものを見ていると思います--- https://www.ngdata.com/parsing-a-large-json-file-efficiently-and-easily/
そしてこれ-- https://stackoverflow.com/a/24838392/814304
主なこと-大きなファイルがある場合は、ファイルを1つずつ読み取り、処理する必要があります。
JsonSurfer を使用して、JsonPathによってすべての内部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配列は1つずつ処理されます。