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 객체 응답을 구문 분석하는 동안 일반적인 오류를 확인할 수도 있습니다. "expected begin_array but was 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 배열 파싱