Android:如何使用翻新从List <class>获取对象属性

时间:2018-07-16 20:12:30

标签: android json list retrofit

请帮我解决这个问题。我想通过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接口,因为我在其他情况下使用了该接口。

非常感谢您!

1 个答案:

答案 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调用。在这种情况下,只需在同一个类中创建一个新方法,并使用如上所述的新返回类型即可。