Получить массив JSON из ответа retrofit
мне нужно разобрать массив JSON из Retrofit. Мне нужно получить следующий ключ:
{
"rc":0,
"message":"success",
"he":[
{
"name":"u05deu05e4u05e7u05d7",
"type":0
}
]
}
Я могу легко получить сообщение, но я не могу получить массив "он" из ответа.
вот мой класс модели данных
public class GetRoleData implements Serializable {
@SerializedName("he")
private ArrayList<Roles> he;
@SerializedName("message")
private String message;
public GetRoleData() {
this.he = new ArrayList<>();
this.message = "";
}
public ArrayList<Roles> getUserRoles() {
return he;
}
public String getMessage() {
return message;
}
public class Roles {
public Roles() {
name = "";
type = -1;
}
@SerializedName("name")
private String name;
@SerializedName("type")
private int type;
public int getType() {
return type;
}
public String getName() {
return name;
}
}
}
вот как я отправляю запрос на сервер:
@POST("index.php/")
Call<GetRoleData> getUserRoles(@Body SetParams body);
вот как я отправляю запрос и обработку ответа
APIService apiService = retrofit.create(APIService.class);
Call<GetRoleData > apiCall = apiService.getUserRoles(params);
apiCall.enqueue(new Callback<GetRoleData >() {
@Override
public void onResponse(retrofit.Response<GetRoleData > mUserProfileData, Retrofit retrofit) {
Log.e("locale info", "mUserProfileData = " + mUserProfileData.body().toString());
if (pDialog != null) {
pDialog.dismiss();
}
if (mUserProfileData.body().getMessage().equals("success")) {
Log.e("locale info", "user roles = " + mUserProfileData.body().getUserRoles().size());
} else {
Toast.makeText(RegisterActivity.this, getResources().getString(R.string.get_role_error), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Throwable t) {
if (pDialog != null) {
pDialog.dismiss();
}
t.printStackTrace();
}
});
что я хочу!--14-->
мне нужно получите массив " он " сверху ответа. Пожалуйста, помогите спасибо.
вот ответ, который я получаю..
5 ответов
обновление для дооснащения 2.0-beta2:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.google.code.gson:gson:2.4'
compile 'com.squareup.okhttp:okhttp:2.5.0'
// compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
}
интерфейс:
@GET("/api/values")
Call<GetRoleData> getUserRoles();
onCreate MainActivity:
// Retrofit 2.0-beta2
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL_BASE)
.addConverterFactory(GsonConverterFactory.create())
.build();
WebAPIService service = retrofit.create(WebAPIService.class);
// Asynchronous Call in Retrofit 2.0-beta2
Call<GetRoleData> call = service.getUserRoles();
call.enqueue(new Callback<GetRoleData>() {
@Override
public void onResponse(Response<GetRoleData> response, Retrofit retrofit) {
ArrayList<GetRoleData.Roles> arrayList = response.body().getUserRoles();
if (arrayList != null) {
Log.i(LOG_TAG, arrayList.get(0).getName());
}
}
@Override
public void onFailure(Throwable t) {
Log.e(LOG_TAG, t.toString());
}
});
Ретрофит 1.9
Я использую свой GetRoleData
класс
интерфейс:
public interface WebAPIService {
@GET("/api/values")
void getUserRoles(Callback<GetRoleData> callback);
}
MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// creating a RestAdapter using the custom client
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL_BASE)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(mOkHttpClient))
.build();
WebAPIService webAPIService = restAdapter.create(WebAPIService.class);
Callback<GetRoleData> callback = new Callback<GetRoleData>() {
@Override
public void success(GetRoleData getRoleData, Response response) {
String bodyString = new String(((TypedByteArray) response.getBody()).getBytes());
Log.i(LOG_TAG, bodyString);
}
@Override
public void failure(RetrofitError error) {
String errorString = error.toString();
Log.e(LOG_TAG, errorString);
}
};
webAPIService.getUserRoles(callback);
}
скриншот выглядит следующим образом:
Моки для тестов ->http://www.mocky.io/v2/567275072500008d0e995b2c Я использую Retrofit 2 (бета-2). Это работает для меня, ничего особенного:
колл определение:
@GET("/v2/567275072500008d0e995b2c")
Call<Base> getMock();
модели:
public class Base {
public int rc;
public String message;
public List<Role> he;
}
public class Role {
public String name;
public int type;
}
Ретрофит:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
вызов execute:
webservice.getMock().enqueue(new Callback<Base>() {
@Override
public void onResponse(Response<Base> response, Retrofit retrofit) {
}
@Override
public void onFailure(Throwable t) {
}
});
вы написали все ваши добытчики, кроме he
правильно. Для того, чтобы Retrofit проанализировать ваш файл JSON, вы должны написать свой геттер для he
переменной следующим образом.
public ArrayList<Roles> getHe() {
return he;
}
кроме того, попробуйте удалить новый ArrayList с конструктором.
public GetRoleData() {
// this.he = new ArrayList<>(); // <-- Remove here
this.message = "";
}
/ / используйте следующие классы Pojo
public class GetRoleData {
@SerializedName("rc")
@Expose
private Integer rc;
@SerializedName("message")
@Expose
private String message;
@SerializedName("he")
@Expose
private List<He> he = new ArrayList<He>();
/**
*
* @return
* The rc
*/
public Integer getRc() {
return rc;
}
/**
*
* @param rc
* The rc
*/
public void setRc(Integer rc) {
this.rc = rc;
}
/**
*
* @return
* The message
*/
public String getMessage() {
return message;
}
/**
*
* @param message
* The message
*/
public void setMessage(String message) {
this.message = message;
}
/**
*
* @return
* The he
*/
public List<He> getHe() {
return he;
}
/**
*
* @param he
* The he
*/
public void setHe(List<He> he) {
this.he = he;
}
}
-----------------------------------com.example.He.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class He {
@SerializedName("name")
@Expose
private String name;
@SerializedName("type")
@Expose
private Integer type;
/**
*
* @return
* The name
*/
public String getName() {
return name;
}
/**
*
* @param name
* The name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
* The type
*/
public Integer getType() {
return type;
}
/**
*
* @param type
* The type
*/
public void setType(Integer type) {
this.type = type;
}
}
еще один простой способ получения данных с помощью веб-сервисов-использовать JsonElement
а затем преобразовать его в JsonObject и проанализировать JsonObject. Ez-Pz.
Примечание: JsonObject не совпадает с JSONobject, JsonObject принадлежит библиотеке GSON