Модернизации предполагается начать возражать, но был начаться массива
Я довольно новичок в разборе JSON, я использую модифицированную библиотеку Square и столкнулся с этой проблемой.
Я пытаюсь разобрать этот ответ 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"
}
]
вот мои модели:
public class Contacts {
public List<User> contacts;
}
...
public class User {
String username;
String regid;
@Override
public String toString(){
return(username);
}
}
интерфейс:
public interface ContactsInterface {
@GET("/users.json")
void contacts(Callback<Contacts> cb);
}
мой путь к успеху:
@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);
}
когда я использую его на моем методе успеха он выдает ошибку
ожидаемый BEGIN_OBJECT но был BEGIN_ARRAY в строке 1 column2
что здесь не так?
6 ответов:
прямо сейчас вы анализируете ответ, как если бы он был отформатирован следующим образом:
{ "contacts": [ { .. } ] }исключение говорит вам об этом в том, что вы ожидаете объект в корне, но реальные данные на самом деле массив. Это означает, что вы должны изменить тип массива.
самый простой способ-просто использовать список в качестве прямого типа в обратном вызове:
@GET("/users.json") void contacts(Callback<List<User>> cb);
в свой интерфейс заменить
@GET("/users.json") void contacts(Callback<Contacts> cb);этот код
@GET("/users.json") void contacts(Callback<List<Contacts>> cb);
преобразовать его в список.
Ниже приведен пример:
BenchmarksListModel_v1[] benchmarksListModel = res.getBody().as(BenchmarksListModel_v1[].class);
Исходный Код Работающего
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(); } });
dependencies used :compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0'ответы json могут быть
array responseилиobject responseили даже сочетание того и другого. См. следующие три случая
Case 1 : Parsing a json array response(дело ОП)этот случай относится к тем
json responsesпо форме[{...} ,{...}]например.
[ { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" }, . . ]сначала создайте класс модели для этого массива или просто goto jsonschema2pojo и авто создать один, как показано ниже
Contacts.javapublic class Contacts { @SerializedName("id") @Expose private Integer id; @SerializedName("username") @Expose private String username; @SerializedName("regid") @Expose private String regid; @SerializedName("url") @Expose private String url; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getRegid() { return regid; } public void setRegid(String regid) { this.regid = regid; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
ContactsInterfaceв этом случае вы должны вернуть список объектов, как показано ниже
public interface ContactsInterface { @GET("/users.json") Call<List<Contacts>> getContacts(); }затем сделать
retrofit2вызовите как следующееRetrofit retrofit = new Retrofit.Builder() .baseUrl("baseurl_here") .addConverterFactory(GsonConverterFactory.create()) .build(); SampleInterface request = retrofit.create(ContactsInterface.class); Call<List<Contacts>> call = request.getAll(); call.enqueue(new Callback<List<Contacts>>() { @Override public void onResponse(Call<List<Contacts>> call, Response<List<Contacts>> response) { Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call<List<Contacts>> call, Throwable t) { Log.e("Error",t.getMessage()); } });
response.body()даст вам список объектовВЫ ТАКЖЕ МОЖЕТЕ ПРОВЕРИТЬ СЛЕДУЮЩИЕ ДВА СЛУЧАЯ Ссылка
Case 2 : Parsing a json object responseэтот случай относится к тем ответам json, которые имеют форму {..}
например.
{ "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" }вот, у нас то же самое
objectв примере выше. Таким образом, класс модели будет таким же, но, как и в приведенном выше примере, у нас нет массива этих объектов - только один объект, и поэтому нам не нужно анализировать его как список.поэтому внесите следующие изменения
object responsepublic interface ContactsInterface { @GET("/users.json") Call<Contacts> getContacts(); }затем сделать
retrofit2вызовите как следующееRetrofit retrofit = new Retrofit.Builder() .baseUrl("baseurl_here") .addConverterFactory(GsonConverterFactory.create()) .build(); SampleInterface request = retrofit.create(ContactsInterface.class); Call<Contacts> call = request.getAll(); call.enqueue(new Callback<Contacts>() { @Override public void onResponse(Call<Contacts> call, Response<Contacts> response) { Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call<Contacts> call, Throwable t) { Log.e("Error",t.getMessage()); } });
response.body()даст вам объект
Case 3 : Parsing a json array inside json objectэтот случай относится к тем
json responsesпо форме{"array_name":[{...} ,{...}]}например.
{ "contacts": [ { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" } ] }здесь вам понадобятся два класса моделей, так как у нас есть два объекта(один снаружи и один внутри массива).Генерировать его, как ниже
ContactWrapperpublic class ContactWrapper { @SerializedName("contacts") @Expose private List<Contacts> contacts = null; public List<Contacts> getContacts() { return contacts; } public void setContacts(List<Contacts> contacts) { this.contacts = contacts; } }можно использовать
Contacts.javaгенерируется выше для объектов списка (генерируется для случая 1)поэтому внесите следующие изменения для
object responsepublic interface ContactsInterface { @GET("/users.json") Call<ContactWrapper> getContacts(); }затем сделать
retrofit2вызовите как следующееRetrofit retrofit = new Retrofit.Builder() .baseUrl("baseurl_here") .addConverterFactory(GsonConverterFactory.create()) .build(); SampleInterface request = retrofit.create(ContactsInterface.class); Call<ContactWrapper> call = request.getAll(); call.enqueue(new Callback<ContactWrapper>() { @Override public void onResponse(Call<ContactWrapper> call, Response<ContactWrapper> response) { Toast.makeText(MainActivity.this,response.body().getContacts().toString(),Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call<ContactWrapper> call, Throwable t) { Log.e("Error",t.getMessage()); } });здесь отличие от случая 1 заключается в том, что мы должны использовать
response.body().getContacts()вместоresponse.body()чтобы получить список объектов
С помощью MPV, в вашем Десериализаторе, положите это
JsonObject obj = new JsonObject(); obj.add("data", json); JsonArray data = obj.getAsJsonObject().getAsJsonArray("data");
Comments