2015-04-30 17 views
24

Ich habe eine sehr einfache JSON mit Bewertungen für Produkte, wie:wie JSON-Datei analysieren mit Gson

{ 
    "reviewerID": "A2XVJBSRI3SWDI", 
    "asin": "0000031887", 
    "reviewerName": "abigail", 
    "helpful": [0, 0], 
    "unixReviewTime": 1383523200, 
    "reviewText": "Perfect red tutu for the price. ", 
    "overall": 5.0, 
    "reviewTime": "11 4, 2013", "summary": "Nice tutu" 
} 
{ 
    "reviewerID": "A2G0LNLN79Q6HR", 
    "asin": "0000031887", 
    "reviewerName": "aj_18 \"Aj_18\"", 
    "helpful": [1, 1], 
    "unixReviewTime": 1337990400, 
    "reviewText": "This was a really cute", 
"overall": 4.0, 
"reviewTime": "05 26, 2012", 
"summary": "Really Cute but rather short." 
} 

Ich mag es in meine Java-Anwendung lesen Gson verwenden. Ich habe eine Klasse gebaut, um Ergebnisse für jede Bewertung zu halten:

public class Review { 
    private String reviewerID; 
    private String asin; 
    private String reviewerName; 
    private ArrayList<Integer> helpful; 
    private String reviewText; 
    private Double overall; 
    private String summary; 
    private Long unixReviewTime; 
    private String reviewTime; 

    public Review() { 
     this.helpful = Lists.newArrayList(); 
    } 
    // some getters and setters... 

die JSON-Datei zu lesen, ist mein Code:

Gson gson = new Gson(); 
JsonReader reader = new JsonReader(new FileReader(filename)); 
Review data = gson.fromJson(reader, Review.class); 
data.toScreen(); // prints to screen some values 

Mit diesem Code kann ich nur die erste Rezension im JSON abrufen Meine Frage ist also: Wie durchläuft man den ganzen Leser und bekommt die nächsten Rezensionen? Ich muss die Bewertungen nicht in einer Liste speichern, sondern muss nur einmal auf das Objekt zugreifen. Jede Hilfe mehr als willkommen.

+0

Analysieren Sie die Zeichenfolge, die Sie empfangen, in ein neues JSONArray(). Führen Sie für jedes Objekt in dem Array gson.fromJson (object, Review.class) aus, und fügen Sie dann alle zu einer leeren Liste hinzu list = new LinkedList (); Wie in, analysieren sie alle nacheinander. – Schaka

Antwort

42

Sie müssen die gesamten Daten in der Liste abrufen und dann die Iteration durchführen, da es sich um eine Datei handelt und ansonsten ineffizient wird.

private static final Type REVIEW_TYPE = new TypeToken<List<Review>>() { 
}.getType(); 
Gson gson = new Gson(); 
JsonReader reader = new JsonReader(new FileReader(filename)); 
List<Review> data = gson.fromJson(reader, REVIEW_TYPE); // contains the whole reviews list 
data.toScreen(); // prints to screen some values 
+1

Ich habe diesen Fehler mit Ihrem Code: java.lang.IllegalStateException: Erwartete BEGIN_ARRAY aber war BEGIN_OBJECT in Zeile 1 Spalte 2 Pfad $ – user299791

+1

überprüfen Sie, ob Ihre JSON-Datei im richtigen Format oder nicht bei [Jsonlint] (http: // Jsonlint. com) –

+1

@Archit Maheshwari - Die Eingabe ist korrekt formatiert und ist gültig. Es enthält zwei JSON-Datenstrukturen vom Typ 'Objekt'. Es ist dein Beispiel, das nicht funktioniert, zumindest nicht mit gson 2.8.0. Nichtsdestotrotz glaube ich, dass Ihr Beispiel einen interessanten Ansatz zur Lösung des Problems bietet. Ich schlage vor, es der Wunschliste von Gson hinzuzufügen. – whaefelinger

17

analysieren nur als Array:

Review[] reviews = new Gson().fromJson(jsonString, Review[].class); 

dann, wenn Sie Sie benötigen, können auf diese Weise auch eine Liste erstellen:

List<Review> asList = Arrays.asList(reviews); 

P. S. Ihre JSON-Zeichenfolge sollte folgendermaßen aussehen:

[ 
    { 
     "reviewerID": "A2SUAM1J3GNN3B1", 
     "asin": "0000013714", 
     "reviewerName": "J. McDonald", 
     "helpful": [2, 3], 
     "reviewText": "I bought this for my husband who plays the piano.", 
     "overall": 5.0, 
     "summary": "Heavenly Highway Hymns", 
     "unixReviewTime": 1252800000, 
     "reviewTime": "09 13, 2009" 
    }, 
    { 
     "reviewerID": "A2SUAM1J3GNN3B2", 
     "asin": "0000013714", 
     "reviewerName": "J. McDonald", 
     "helpful": [2, 3], 
     "reviewText": "I bought this for my husband who plays the piano.", 
     "overall": 5.0, 
     "summary": "Heavenly Highway Hymns", 
     "unixReviewTime": 1252800000, 
     "reviewTime": "09 13, 2009" 
    }, 

    [...] 
] 
+0

Ich erhalte einen Fehler mit Ihrem Code: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Erwarteter Wert in Zeile 1 Spalte 1 Pfad $ – user299791

+1

Zeigen Sie uns die ersten Zeilen Ihrer REAL-JSON-Zeichenfolge – dit

+0

Entschuldigung, meine Datei ist 3GB, ich habe versucht, mit VIM zu laden, aber kann es nicht laden – user299791