Android JSon-Fehler "Erwartete BEGIN_OBJECT aber war BEGIN_ARRAY an Zeile 1 Spalte 2"

Ich bekomme JSon-Daten aus einem Web-Service, die Beispieldaten sind unten angegeben:

[ { "SectionId": 1, "SectionName": "Android" } ] 

Wenn ich versuche, es zu konvertieren, wirft es einen Fehler, ich tue es als:

 Data data = new Gson().fromJson(jsonDataFromWebService, Data.class); 

Meine Sektionsklasse ist:

 class Section { public int SectionId; public String SectionName; } class Data { public List<Section> sections; } 

Der LogCat sagt:

Com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Erwartete BEGIN_OBJECT aber war BEGIN_ARRAY an Zeile 1 Spalte 2

  • OkHttp Post Körper als JSON
  • Wie lese ich json Antwort mit Jackson in Android?
  • Einrichten einer asynchronen Aufgabe zum Laden von Json in eine Listenansicht
  • JSON von URL auf Android abrufen
  • Wie man json Objekt zu Server mit Volley in andorid zu senden
  • JSONObject nicht serialisierbar?
  • Wie benutzt man benutzerdefinierte generic in GSON TypeToken Klasse?
  • Legen Sie eine Zeichnung als Hintergrund programmgesteuert fest
  • 3 Solutions collect form web for “Android JSon-Fehler "Erwartete BEGIN_OBJECT aber war BEGIN_ARRAY an Zeile 1 Spalte 2"”

    Der Fehler erklärt, was falsch ist … ur Rückgabe eines Arrays und kein JSon-Objekt

    Versuche wie folgt:

     JSONArray ja = new JSONArray(jsonStringReturnedByService); Data sections = new Data(); for (int i = 0; i < ja.length(); i++) { Section s = new Section(); JSONObject jsonSection = ja.getJSONObject(i); s.SectionId = Integer.ValueOf(jsonSection.getString("SectionId")); s.SectionName = jsonSection.getString("SectionName"); //add it to sections list sections.add(s); } return sections; 

    Sie versuchen, ein Nicht-Array-Objekt (Collection) aus einem JSONArray zu erstellen. Der Fehler ist ziemlich klar: GSON erwartete den Anfang eines Objekts, fand aber den Anfang eines Arrays statt.

    Schauen Sie sich die Dokumentationsseite an, um zu sehen, wie Sie mit Array- und Collection-Typen mit GSON arbeiten können

    https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

    Aus den docs:

    Array Beispiele

    Gson gson = neue Gson (); Int [] ints = {1, 2, 3, 4, 5}; String [] Strings = {"abc", "def", "ghi"};

    (Serialisierung) gson.toJson (ints); ==> druckt [1,2,3,4,5] gson.toJson (Saiten); ==> druckt ["abc", "def", "ghi"]

    (Deserialisierung) int [] ints2 = gson.fromJson ("[1,2,3,4,5]", int [] Klasse); ==> ints2 ist gleich wie ints

    Wir unterstützen auch mehrdimensionale Arrays mit beliebig komplexen Elementtypen Sammlungsbeispiele

    Gson gson = neue Gson (); Sammlung ints = Lists.immutableList (1,2,3,4,5);

    (Serialisierung) String json = gson.toJson (ints); ==> json ist [1,2,3,4,5]

    (Deserialisierung) Typ collectionType = new TypeToken> () {}. GetType (); Sammlung ints2 = gson.fromJson (json, collectionType); Ints2 ist gleich wie ints

    Ziemlich schrecklich: Notiz, wie wir die Art der Sammlung definieren Leider gibt es hier keine Möglichkeit, dies in Java zu umgehen

    Sammlungen Einschränkungen

    Kann die Sammlung von willkürlichen Objekten serialisieren, kann aber nicht davon abwarten, denn es gibt keine Möglichkeit für den Benutzer, den Typ des resultierenden Objekts anzuzeigen Während des Desialialisierens muss die Sammlung von einem bestimmten generischen Typ sein. Das alles macht Sinn und ist selten ein Problem W> Henne nach guten Java-Coding-Praktiken

    Verwenden Sie die Sektionsklasse nur wie folgt:

     Section[] sectionArray = new Gson().fromJson(jsonDataFromWebService, Section[].class); for (Section section: sectionArray) { Log.e("Debug", section.toString()); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.