2013-08-04 2 views
2

J'utilise Jackson pour analyser JSON d'un JSON inputStream qui ressemble à ce qui suit:Parsing JSON avec Jackson

[ 
     [ 36, 
     100, 
     "The 3n + 1 problem", 
     56717, 
     0, 
     1000000000, 
     0, 
     6316, 
     0, 
     0, 
     88834, 
     0, 
     45930, 
     0, 
     46527, 
     5209, 
     200860, 
     3597, 
     149256, 
     3000, 
     1 
     ], 
     [ 
     ........ 
     ], 
     [ 
     ........ 
     ], 
     .....// and almost 5000 arrays like above 
] 

Ceci est le lien d'alimentation d'origine: http://uhunt.felix-halim.net/api/p

Je veux analyser et Ne conservez que les 4 premiers éléments de chaque tableau et ignorez les 18 autres éléments.

36 
100 
The 3n + 1 problem 
56717 

la structure du code, je l'ai essayé jusqu'à présent:

while (jsonParser.nextToken() != JsonToken.END_ARRAY) { 

     jsonParser.nextToken(); // '[' 
     while (jsonParser.nextToken() != JsonToken.END_ARRAY) { 
      // I tried many approaches here but not found appropriate one 
     } 

} 

Comme ce flux est assez grand, je dois le faire efficacement avec moins de frais généraux et de la mémoire. Il existe également trois modèles pour traiter JSON: Streaming API, Liaison de données et Arbre Modèle. Lequel est approprié pour mon but?

Comment est-ce que je peux analyser ce json efficacement avec Jackson? Comment puis-je sauter ces 18 éléments et passer au tableau suivant pour de meilleures performances?

Edit: (Solution)

Jackson et GSon les deux œuvres, presque dans le même mécanisme (mode incrémental, étant donné que le contenu est lu et écrit progressivement), je suis le passage à GSON car il a une fonction skipValue() (assez approprié avec le nom). Bien que nextToken() de Jackson fonctionnera comme skipValue(), GSON semble plus flexible pour moi. Merci frère @Kowser pour sa recommandation, je suis venu à connaître GSON avant mais en quelque sorte ignoré. Ceci est mon code de travail:

reader.beginArray(); 
while (reader.hasNext()) { 
    reader.beginArray(); 
    int a = reader.nextInt(); 
    int b = reader.nextInt(); 
    String c = reader.nextString(); 
    int d = reader.nextInt(); 
    System.out.println(a + " " + b + " " + c + " " + d); 
    while (reader.hasNext()) 
     reader.skipValue(); 
    reader.endArray(); 
} 
reader.endArray(); 
reader.close(); 
+0

Bonne chance avec GSON, c'est une bibliothèque décente. Cependant, je ne vois pas le point de 'skipValue()' - Jackson a 'skipChildren()' qui fait la même chose, en sautant toute la valeur logique (qui pour les valeurs structurées consiste en plusieurs jetons). – StaxMan

Répondre

3

Ceci est pour Jackson

Suivez this tutorial.

Une utilisation judicieuse de jasonParser.nextToken() devrait vous aider.

while (jasonParser.nextToken() != JsonToken.END_ARRAY) { // might be JsonToken.START_ARRAY? 

Le pseudo-code est

  1. trouver la prochaine gamme
    1. valeurs lues
    2. sauter les autres valeurs
    3. saut jeton suivant fin

Ceci est pour gson. Regardez le this tutorial. Pensez à suivre le deuxième exemple du tutoriel.

L'utilisation judicieuse de reader.begin*reader.end* et reader.skipValue devrait faire le travail pour vous.

Et voici la documentation JsonReader

+0

vai, merci pour votre réponse! maintenant ça marche! J'ai édité ma réponse et ajouté ma solution, j'ai finalement utilisé GSON. –