So parsen Sie eine JSON-Datei mit GSON

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer299791

Ich habe ein sehr einfaches JSON mit Bewertungen für Produkte, wie:

{
  "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 möchte es mit GSON in meine Java-App einlesen. Ich habe eine Klasse erstellt, um die Ergebnisse für jede Überprüfung zu speichern:

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...

Um die JSON-Datei zu lesen, lautet 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 Bewertung im JSON abrufen, daher lautet meine Frage: Wie kann ich alle Leser durchlaufen und die nächsten Bewertungen abrufen? Ich muss die Bewertungen nicht in einer Liste speichern, sondern nur einmal auf das Objekt zugreifen. Jede Hilfe mehr als willkommen.

  • Analysieren Sie die erhaltene Zeichenfolge in ein neues JSONArray(). Führen Sie für jedes Objekt im Array gson.fromJson(object, Review.class) aus und fügen Sie sie dann alle zu einer leeren List hinzu list = new LinkedList(); Analysieren Sie sie wie in alle nacheinander.

    – Schaka

    30. April 2015 um 10:57 Uhr

Benutzer-Avatar
Archit Maheshwari

Sie müssen die gesamten Daten in der Liste abrufen und dann die Iteration durchführen, da es sich um eine Datei handelt und sonst 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

  • Ich habe diesen Fehler mit Ihrem Code: java.lang.IllegalStateException: BEGIN_ARRAY erwartet, aber BEGIN_OBJECT in Zeile 1, Spalte 2, Pfad $

    – Benutzer299791

    30. April 2015 um 11:20 Uhr

  • Überprüfen Sie, ob Ihre JSON-Datei das richtige Format hat oder nicht jsonlint

    – Archit Maheshwari

    30. April 2015 um 11:34 Uhr


  • @Archit Maheshwari – Die Eingabe ist korrekt formatiert und gültig. Es enthält zwei JSON-Datenstrukturen vom Typ ‘object’. Es ist Ihr Beispiel, das nicht funktioniert, zumindest nicht mit gson 2.8.0. Trotzdem glaube ich, dass Ihr Beispiel einen interessanten Ansatz zur Lösung des Problems bietet. Ich schlage vor, es zu Gsons Wunschliste hinzuzufügen.

    – wh81752

    14. Februar 2017 um 10:59 Uhr

  • Warum type statt just verwenden Review[] data = gson.fromJson(reader, Review[].class);?

    – Linie

    17. Mai 2017 um 10:48 Uhr


  • Sie müssen das TypeToken hier nicht verwenden. Typ-Token ist nur erforderlich, wenn Sie mit Generics arbeiten und einen Typ hinzufügen müssen, um sicherzustellen, dass Gson ihn analysieren kann. Wenn Sie mehr Details wollen, können Sie gehen github.com/google/gson/blob/master/…

    – paul_f

    19. Juli 2019 um 9:41 Uhr

Benutzer-Avatar
Dieter

einfach als Array analysieren:

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

dann können Sie bei Bedarf auch eine Liste auf diese Weise erstellen:

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

PS Ihr Json-String sollte so 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"
    },

    [...]
]

  • Ich erhalte einen Fehler mit Ihrem Code: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 1 path $

    – Benutzer299791

    30. April 2015 um 11:18 Uhr

  • Entschuldigung, meine Datei ist 3 GB groß, ich habe versucht, sie mit VIM zu laden, kann sie aber nicht laden

    – Benutzer299791

    30. April 2015 um 12:38 Uhr


  • Zeigen Sie mir einfach die ersten Bytes der Datei. Ich nehme an, Ihre JSON-Zeichenfolge ist ungültig

    – Dieter

    30. April 2015 um 12:42 Uhr

  • Mann, wenn du mir sagst, wie es geht, würde ich es gerne tun !!! Ich verwende Mac OSX. Haben Sie eine Zeile, die ich in das Terminal kopieren kann, um sie anzuzeigen?

    – Benutzer299791

    30. April 2015 um 12:44 Uhr

  • Sie sind Programmierer, tun Sie es in Java :): mkyong.com/java/… erste Zeile reicht

    – Dieter

    30. April 2015 um 12:46 Uhr


Benutzer-Avatar
Konstantin Trepadus

Falls Sie es von a analysieren müssen DateiIch finde die beste Lösung, um a zu verwenden HashMap<String, String> um es zur besseren Bearbeitung in Ihrem Java-Code zu verwenden.

Probieren Sie diesen Code aus:

public HashMap<String, String> myMethodName() throws FileNotFoundException
{
    String path = "absolute path to your file";
    BufferedReader bufferedReader = new BufferedReader(new FileReader(path));

    Gson gson = new Gson();
    HashMap<String, String> json = gson.fromJson(bufferedReader, HashMap.class);
    return json;
}

1016840cookie-checkSo parsen Sie eine JSON-Datei mit GSON

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy