请帮我解决这个问题。我想通过REST API从JSON对象获取一些数据。
这是json的演示:
{
"itemList": [
{
"name": "AF1_AC",
"value": false,
"awid": "1",
"sys": {
"cts": "2018-07-16T14:51:34.166Z",
"mts": "2018-07-16T17:49:40.206Z",
"rev": 775
},
"id": "5b4cb0f66a4c333860d64d79"
},
{
"name": "ST1_RE",
"value": 27.11,
"awid": "1",
"sys": {
"cts": "2018-07-15T14:53:05.228Z",
"mts": "2018-07-16T17:49:40.320Z",
"rev": 4124
}
}
]
}
这是我的界面:
public interface FarmAPI {
String BASE_URL = "http://10.0.2.2:6221/";
@GET("smartfarm/0-1/listFarmObjectValue") Call<ItemList> getItemList();
class Factory {
private static FarmAPI service;
public static FarmAPI getInstance() {
if (service == null) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().
addInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(BASE_URL)
.client(client).build();
service = retrofit.create(FarmAPI.class);
return service;
} else {
return service;
}
}
}
}
这是jsonschema2pojo生成的类:
public class ListFarmObjectValue {
@SerializedName("itemList")
@Expose
private List<ItemList> itemList = null;
public List<ItemList> getItemList() {
return itemList;
}
public void setItemList(List<ItemList> itemList) {
this.itemList = itemList;
}
}
第二个:
public class ItemList {
@SerializedName("name")
@Expose
private String name;
@SerializedName("value")
@Expose
private double value;
@SerializedName("awid")
@Expose
private String awid;
@SerializedName("id")
@Expose
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public String getAwid() {
return awid;
}
public void setAwid(String awid) {
this.awid = awid;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
现在我想从名称为ST1_RE的对象获取值,并将值设置为特定的TextView。在onCreate方法中:
FarmAPI.Factory.getInstance().getItemList().enqueue(new Callback<ItemList>() {
@Override
public void onResponse(Call<ItemList> call, Response<ItemList> response) {
if (response.body().getName().equals("ST1_RE")) {
realTemperature.setText(response.body().getValue() + "");
}
}
@Override
public void onFailure(Call<ItemList> call, Throwable t) {
t.printStackTrace();
}
});
但是它不起作用:( 您能告诉我在这种情况下我该怎么做吗?或者,如果不更好,也许不通过jsonschema2pojo生成类...?我看到了一些示例,但对我来说却是新类别,我不理解。而且我也不想更改FarmAPI接口,因为我在其他情况下使用了该接口。
非常感谢您!
答案 0 :(得分:0)
1)更改API调用的预期类型
@GET("smartfarm/0-1/listFarmObjectValue") Call<ItemList> getItemList();
到
@GET("smartfarm/0-1/listFarmObjectValue") Call< ListFarmObjectValue > getItemList();
2)遍历ItemList对象的列表,找到名称为“ ST1_RE”的对象
FarmAPI.Factory.getInstance().getItemList().enqueue(new Callback<ListFarmObjectValue>() {
@Override
public void onResponse(Call<ListFarmObjectValue> call, Response<ListFarmObjectValue> response) {
ListFarmObjectValue value = response.body();
for(ItemList item : value.getItemList()){
if (item.getName().equals("ST1_RE")) {
realTemperature.setText(response.body().getValue() + "");
break;
}
}
}
});
编辑: 我刚刚看到您的消息,即您不想更改API调用。在这种情况下,只需在同一个类中创建一个新方法,并使用如上所述的新返回类型即可。