Rikhil Shah
Rikhil Shah

Reputation: 58

How To Retrieve Item Specific Fields Of JSON using Retrofit

This is the following json object I am getting:

{ "1":"data", "2":"data", "3":"data", "4":"data"}

data is an int being recieved from a sensor. 1,2,3&4 are the different sensor values.

My Api Class:

public interface DetailsAPI {
@GET("/SET/team1/retrieve_data")
Call<ResponseBody> getpost();
}

My Main Class Where I Call This:

Retrofit retrofit = new Retrofit.Builder().baseUrl(ip.ip).build();

    final DetailsAPI api = retrofit.create(DetailsAPI.class);
    final Handler handler=new Handler();
    handler.post(new Runnable(){
        @Override
        public void run() {
            api.getpost().enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    try {

                        String res = response.body().string();
                        sensor1.setText(res);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {

                }
            });
            // upadte textView here
            handler.postDelayed(this,100); // set time here to refresh textView
        }
    });

When it is printed I get:

{ "1":"data", "2":"data", "3":"data", "4":"data"}

I want to be able to specify what 1 , 2 ,3 and 4 is without the {"" :""}

The desired output I would like would be something like

Light : data
Sound : data
Temp : data

Upvotes: 0

Views: 4325

Answers (4)

Add gson-converter to your project and Create your pojo class as:

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class SensorData{

@SerializedName("1")
@Expose
private String sensor1;
@SerializedName("2")
@Expose
private String sensor2;
@SerializedName("3")
@Expose
private String sensor3;
@SerializedName("4")
@Expose
private String sensor4;

public String getSensor1() {
return sensor1;
}

public void setSensor1(String sensor1) {
this.sensor1= sensor1;
}

public String getSensor2() {
return sensor2;
}

public void setSensor2(String sensor2) {
this.sensor2= sensor2;
}

public String getSensor3() {
return sensor3;
}

public void setSensor3(String sensor3) {
this.sensor3= sensor3;
}

public String getSensor4() {
return sensor4;
}

public void setSensor4(String sensor4) {
this.sensor4= sensor4;
}

}

API class:

public interface DetailsAPI {
@GET("/SET/team1/retrieve_data")
Call<SensorData> getPost();
}

setup Retrofit callback as:

Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(url)
                        .client(httpClient)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

DetailsAPI api = retrofit.create(DetailsAPI.class);
api.getPost().enqueue(new Callback<SensorData>() {
        @Override
        public void onResponse(Call<SensorData> call, 
        Response<SensorData> response) {
            Log.d(TAG, "onResponse: ");
            SensorData sensorData = response.body();
            System.out.println("Light :"+sensorData.getSensor1());
            System.out.println("Sound :"+sensorData.getSensor2());
            System.out.println("Temp :"+sensorData.getSensor3());
            System.out.println("Fire :"+sensorData.getSensor4());
        }

        @Override
        public void onFailure(Call<SensorData> call, Throwable t) {
            Log.d(TAG, "onFailure: ");
        }
    });

Upvotes: 1

Navneet Krishna
Navneet Krishna

Reputation: 5017

Change model class for response like this

public class ResponseBody {

@SerializedName("1")
@Expose
private String _1;
@SerializedName("2")
@Expose
private String _2;
@SerializedName("3")
@Expose
private String _3;
@SerializedName("4")
@Expose
private String _4;

public String get1() {
return _1;
}

public void set1(String _1) {
this._1 = _1;
}

public String get2() {
return _2;
}

public void set2(String _2) {
this._2 = _2;
}

public String get3() {
return _3;
}

public void set3(String _3) {
this._3 = _3;
}

public String get4() {
return _4;
}

public void set4(String _4) {
this._4 = _4;
}
}

Then change your retrofit onResponse contents like this

    try {

             ResponseBody res = response.body().string();
             sensor1.setText("Light :"+res.get1());
             sensor2.setText("Sound :"+res.get2()); //create textview sensor2
             sensor3.setText("Temp :"+res.get3()); //create textview sensor3
             } catch (IOException e) {
                    e.printStackTrace();
        }

Upvotes: 0

niketshah09
niketshah09

Reputation: 490

you need to add GSON Convertor to retrofit.

create a class like this

class Data{
    String key;
    String value;
}

make your Interface like this

@GET("group/{id}/users") Call<List<Data>> groupList(@Path("id") int groupId);

your retrofit callback

Retrofit retrofit = new Retrofit.Builder().baseUrl(ip.ip).build();
final DetailsAPI api = retrofit.create(DetailsAPI.class);
final Handler handler=new Handler();
handler.post(new Runnable(){ @Override public void run() { 
api.getpost().enqueue(new Callback<List<Data>>() { 
@Override public void onResponse(Call<List<Data>> call, Response<List<Data>> response) {
 try { List<Data> res = response.body()
// after this us can use this list to iterate over.
 }
 catch (IOException e) { e.printStackTrace(); } } 
@Override public void onFailure(Call<List<Data>> call, Throwable t) { } }); // upadte textView here handler.postDelayed(this,100); // set time here to refresh textView } });

Upvotes: 2

Maksym V.
Maksym V.

Reputation: 2937

So your call is stated to get ResponseBody object as a response. You can create your own response class and replace ResponseBody.

You can find some calls here : http://square.github.io/retrofit/

It looks like:

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

It will also affect callback, you will get your class as a response.

Upvotes: 1

Related Questions