studio jsonsyntaxexception fromjson expected error data column but begin_object begin_array java android json gson retrofit

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(); } });