Reputation: 58
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
Reputation: 231
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
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
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
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