J'ai 100 millions d'enregistrements dans le fichier JSON
, j'ai besoin d'une méthode efficace et rapide pour lire le tableau de tableaux à partir d'un fichier JSON
dans Java
.
Le fichier JSON
ressemble à ceci:
[["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"],...,["XYZ",...,"ABC"],
...
...
...
,["XYZ",...,"ABC"],["XYZ",...,"ABC"],["XYZ",...,"ABC"]]
Je veux lire ce fichier JSON
ligne par ligne comme suit:
lire d'abord:
["XYZ",...,"ABC"]
puis:
["XYZ",...,"ABC"]
bientôt:'
...
...
...
["XYZ",...,"ABC"]
Comment lire un fichier JSON
comme celui-ci, je sais que ce n'est pas tout à fait un fichier JSON
mais je dois lire ce fichier dans ce format, qui est enregistré au format .JSON
Vous pouvez utiliser API de traitement JSON (JSR 353) , pour traiter vos données en mode continu:
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);
}
}
}
S'il vous plaît jeter un oeil sur Jackson Streaming API,
Je suppose que vous regardez quelque chose comme ceci - https://www.ngdata.com/parsing-a-large-json-file-efficiently-and-easily/
et ceci - https://stackoverflow.com/a/24838392/814304
La chose principale - si vous avez un gros fichier, vous devez lire et traiter le fichier paresseux, pièce par pièce.
Vous pouvez utiliser JsonSurfer pour extraire tous les tableaux JSON internes par un chemin JsonPath: $ [*]
JsonSurfer surfer = JsonSurferJackson.INSTANCE;
surfer.configBuilder().bind("$[*]", new JsonPathListener() {
@Override
public void onValue(Object value, ParsingContext context) {
System.out.println(value);
}
}).buildAndSurf(json);
Il ne chargera pas tout Json en mémoire. Le tableau JSON sera traité un par un.