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
(Справа OP)
Цей випадок стосується тих, json responses
що мають таку форму[{...} ,{...}]
Напр
[
{
"id": 3,
"username": "jezer",
"regid": "oiqwueoiwqueoiwqueoiwq",
"url": "http:\/\/192.168.63.175:3000\/users\/3.json"
},
.
.
]
Спочатку створіть клас моделі для цього масиву або просто перейдіть до jsonschema2pojo і автоматично згенеруйте такий, як показано нижче
Contacts.java
public 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();
ContactsInterface request = retrofit.create(ContactsInterface.class);
Call<List<Contacts>> call = request.getContacts();
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 response
public interface ContactsInterface {
@GET("/users.json")
Call<Contacts> getContacts();
}
Потім retrofit2
зателефонуйте, як показано нижче
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("baseurl_here")
.addConverterFactory(GsonConverterFactory.create())
.build();
ContactsInterface request = retrofit.create(ContactsInterface.class);
Call<Contacts> call = request.getContacts();
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()
дасть вам об'єкт
Ви також можете перевірити поширену помилку під час аналізу відповіді об'єкта json: "очікуваний begin_array, але був begin_object"
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"
}
]
}
Тут вам знадобляться два класи моделей, оскільки у нас є два об’єкти (один зовні і один всередині масиву). Створіть його, як показано нижче
ContactWrapper
public 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 response
public interface ContactsInterface {
@GET("/users.json")
Call<ContactWrapper> getContacts();
}
Потім retrofit2
зателефонуйте, як показано нижче
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("baseurl_here")
.addConverterFactory(GsonConverterFactory.create())
.build();
ContactsInterface request = retrofit.create(ContactsInterface.class);
Call<ContactWrapper> call = request.getContacts();
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()
щоб отримувати список об’єктів
Деякі посилання на вищезазначені випадки:
випадок 1: Розбір відповіді масиву json , випадок 2: Розбір відповіді об’єкта json , змішаний: Розбір масиву json всередині іншого об’єкта json