java - jsonsyntaxexception - Retrofit Se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY
jsonsyntaxexception java lang illegalstateexception expected begin_object (5)
Conviértalo en una lista.
A continuación está el ejemplo:
BenchmarksListModel_v1[] benchmarksListModel = res.getBody().as(BenchmarksListModel_v1[].class);
Soy bastante nuevo en el análisis JSON, estoy usando la biblioteca Retrofit de Square y encontré este problema.
Estoy tratando de analizar esta respuesta JSON:
[
{
"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"
}
]
Aquí están mis modelos:
public class Contacts {
public List<User> contacts;
}
...
public class User {
String username;
String regid;
@Override
public String toString(){
return(username);
}
}
mi interfaz:
public interface ContactsInterface {
@GET("/users.json")
void contacts(Callback<Contacts> cb);
}
mi método de éxito:
@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);
}
Cuando lo uso en mi método de éxito arroja el error
Se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY en la línea 1 columna2
¿Que esta mal aquí?
En este momento está analizando la respuesta como si estuviera formateada así:
{
"contacts": [
{ .. }
]
}
La excepción te dice esto porque esperas un objeto en la raíz pero los datos reales son en realidad una matriz. Esto significa que debe cambiar el tipo para que sea una matriz.
La manera más fácil es simplemente usar una lista como tipo directo en la devolución de llamada:
@GET("/users.json")
void contacts(Callback<List<User>> cb);
Usando MPV , en su Deserializer, ponga esto
JsonObject obj = new JsonObject();
obj.add("data", json);
YourResponse response = gson.fromJson(obj.toString(), YourResponse.class);
JsonArray data = obj.getAsJsonObject().getAsJsonArray("data");
en su interfaz reemplazar
@GET("/users.json")
void contacts(Callback<Contacts> cb);
Por este código
@GET("/users.json")
void contacts(Callback<List<Contacts>> cb);
Código fuente de trabajo
https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU
public interface ApiInterface {
@GET("inbox.json")
Call<List<Message>> getInbox();
}
call.enqueue(new Callback<List<Message>>() {
@Override
public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {
YourpojoClass.addAll(response.body());
mAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<Message>> call, Throwable t) {
Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show();
}
});