Reputation: 5097
I need to parse JSON array from Retrofit. I need to get the following key:
{
"rc":0,
"message":"success",
"he":[
{
"name":"\u05de\u05e4\u05e7\u05d7",
"type":0
}
]
}
I can easily get the message but I am not able to get "he" array from response.
Here is my data model class
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;
}
}
}
This is how I am sending request to the server:
@POST("index.php/")
Call<GetRoleData> getUserRoles(@Body SetParams body);
here is how i am sending request and handling response
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();
}
});
What i want
I need to get the "he" array from above response. Please help Thanks.
here is response that i am getting..
Upvotes: 7
Views: 21226
Reputation: 876
Another easy way of getting data using webservices is by using JsonElement
and then convert it into JsonObject and parse JsonObject. Ez-Pz.
Note : JsonObject is not same as JSONobject, JsonObject belongs to GSON's library
Upvotes: 0
Reputation: 24114
UPDATE FOR Retrofit 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'
}
Interface:
@GET("/api/values")
Call<GetRoleData> getUserRoles();
MainActivity's onCreate:
// 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());
}
});
Retrofit 1.9
I use your GetRoleData
class
The interface:
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);
}
The screenshot as the following:
Upvotes: 8
Reputation: 4366
Mocky for tests -> http://www.mocky.io/v2/567275072500008d0e995b2c I'm using Retrofit 2 (beta-2). This works for me, nothing special about it:
Call definition:
@GET("/v2/567275072500008d0e995b2c")
Call<Base> getMock();
Models:
public class Base {
public int rc;
public String message;
public List<Role> he;
}
public class Role {
public String name;
public int type;
}
Retrofit:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
Call execute:
webservice.getMock().enqueue(new Callback<Base>() {
@Override
public void onResponse(Response<Base> response, Retrofit retrofit) {
}
@Override
public void onFailure(Throwable t) {
}
});
Upvotes: 3
Reputation: 2398
You have written all your getters except he
correctly. In order for Retrofit to parse your JSON file, you should write your getter for he
variable as follows.
public ArrayList<Roles> getHe() {
return he;
}
Also, try removing new ArrayList from the constructor.
public GetRoleData() {
// this.he = new ArrayList<>(); // <-- Remove here
this.message = "";
}
Upvotes: 2
Reputation: 2911
// Use the following Pojo Classes
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;
}
}
Upvotes: 1