Mustanser Iqbal
Mustanser Iqbal

Reputation: 5097

Get JSON array from retrofit Response

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..

enter image description here

Upvotes: 7

Views: 21226

Answers (5)

Bawa
Bawa

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

BNK
BNK

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:

enter image description here

Upvotes: 8

rafakob
rafakob

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

berkayk
berkayk

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

vipin agrahari
vipin agrahari

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

Related Questions