Retrofit erwartet BEGIN_OBJECT aber war BEGIN_ARRAY
Ich bin Recht neu auf JSON-parsing , ich bin mit dem Retrofit-Bibliothek Platz und lief in dieses problem.
Ich versuche zu Parsen von JSON response:
[
{
"id": 3,
"username": "jezer",
"regid": "oiqwueoiwqueoiwqueoiwq",
"url": "http:\/\/192.168.63.175:3000\/users\/3.json"
},
{
"id": 4,
"username": "emulator",
"regid": "qwoiuewqoiueoiwqueoq",
"url": "http:\/\/192.168.63.175:3000\/users\/4.json"
},
{
"id": 7,
"username": "test",
"regid": "ksadqowueqiaksj",
"url": "http:\/\/192.168.63.175:3000\/users\/7.json"
}
]
Hier sind meine Modelle:
public class Contacts {
public List<User> contacts;
}
...
public class User {
String username;
String regid;
@Override
public String toString(){
return(username);
}
}
mein Interface:
public interface ContactsInterface {
@GET("/users.json")
void contacts(Callback<Contacts> cb);
}
mein Erfolgs-Methode:
@Override
public void success(Contacts c, Response r) {
List<String> names = new ArrayList<String>();
for (int i = 0; i < c.contacts.size(); i++) {
String name = c.contacts.get(i).toString();
Log.d("Names", "" + name);
names.add(name);
}
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, names);
mSentTo.setAdapter(spinnerAdapter);
}
Wenn ich es auf meinen Erfolg Methode, die den Fehler auslöst
Erwartet BEGIN_OBJECT aber war BEGIN_ARRAY in Zeile 1 Spalte 2
Was ist hier falsch?
InformationsquelleAutor der Frage Jezer Crespo | 2014-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jetzt das Parsen der Antwort, als ob es wurde wie folgt formatiert:
Ausnahme, erzählt Sie dieser, dass Sie erwarten, dass ein Objekt an der Wurzel, aber die realen Daten ist eigentlich ein array. Dies bedeutet, dass Sie brauchen, um zu ändern, geben Sie ein array.
Der einfachste Weg ist es, einfach eine Liste verwenden, als die direkte Art, in der Rückruf:
InformationsquelleAutor der Antwort Jake Wharton
in der Schnittstelle
ersetzen
Durch diesen code
InformationsquelleAutor der Antwort Francisco MEza
Wandeln es in eine Liste.
Unten ist das Beispiel:
InformationsquelleAutor der Antwort kkashyap1707
- Source-Code Arbeiten
https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU
InformationsquelleAutor der Antwort Keshav Gera
dependencies used :
json-Antworten kann eine
array response
oder eineobject response
oder sogar eine Kombination von beiden. Finden Sie unter den folgenden drei FällenCase 1 : Parsing a json array response
(OP-Fall)Diesem Fall gilt für die
json responses
die sind von der form[{...} ,{...}]
E. g.
Erstellen Sie zunächst eine model-Klasse für dieses Feld oder nur springen jsonschema2pojo und automatische generieren einer wie unten
Contacts.java
ContactsInterface
In diesem Fall sollten Sie zurück eine Liste von Objekten, wie das folgende
Dann machen die
retrofit2
Aufruf wie der folgenderesponse.body()
wird Ihnen die Liste der ObjekteKÖNNEN SIE AUCH ÜBERPRÜFEN SIE DIE FOLGENDEN BEIDEN FÄLLE FÜR REFERENZ
Case 2 : Parsing a json object response
Diesem Fall gilt für die json-Antworten, die sind von der form {..}
E. g.
Hier haben wir die gleiche
object
wie oben Beispiel. Also die model-Klasse werden die gleichen sein, aber wie das obige Beispiel, dass wir dont haben eine Reihe von diesen Objekten - nur ein einzelnes Objekt ist und daher wir brauchen nicht zu analysieren, es als eine Liste.Also machen Sie die folgenden änderungen für eine
object response
Dann machen die
retrofit2
Aufruf wie der folgenderesponse.body()
geben Sie das ObjektCase 3 : Parsing a json array inside json object
Diesem Fall gilt für die
json responses
die sind von der form{"array_name":[{...} ,{...}]}
E. g.
Müssen Sie zwei Modell-Klassen hier, da haben wir zwei Objekte(eine außerhalb und eine innerhalb des array).Erzeugen Sie wie unten
ContactWrapper
Können Sie
Contacts.java
generiert, die oben für die Liste Objekte(generiert, für den Fall 1)Also machen Sie die folgenden änderungen für eine
object response
Dann machen die
retrofit2
Aufruf wie der folgendeHier, der Unterschied zu Fall 1 ist, dass sollten wir nutzen
response.body().getContacts()
stattresponse.body()
aus, um die Liste der ObjekteInformationsquelleAutor der Antwort Navneet Krishna
Mit MPVin Ihrem Deserializer, setzen diese
InformationsquelleAutor der Antwort JoseDuin