web-dev-qa-db-fra.com

Méthode rapide et efficace pour lire de gros fichiers JSON ligne par ligne en Java

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

3
AAK M

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);
         }
     }
}
5
zeppelin

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.

2
iMysak

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. 

1
Leo Wang