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
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
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
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;
}
10168400cookie-checkSo parsen Sie eine JSON-Datei mit GSONyes
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