[英]I want to get a list of specific objects from the json array that I get with Retrofit2. how do I do this?
Json structure PS The reference is not dynamic so there is just a JSON data array; Json结构 PS该引用不是动态的,因此只有一个JSON数据数组。
I do everything on documentation but I receive simply an array and I cannot take from it the list of separate elements for example coordinates which are in this array 我在文档中做了所有工作,但我只收到一个数组,因此无法从中获取单独元素的列表,例如此数组中的坐标
MainActivity.class : MainActivity.class:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Service.getInstance()
.getJSONApi()
.loadList()
.enqueue(new Callback<List<Pandomats>>() {
@Override
public void onResponse(Call<List<Pandomats>> call, Response<List<Pandomats>> response) {
pandomats.addAll(response.body());
Log.v("ListPandomats", String.valueOf(pandomats.size()));
}
@Override
public void onFailure(Call<List<Pandomats>> call, Throwable t) {
}
});
Service.java : Service.java:
public class Service {
private static final Service ourInstance = new Service();
private static final String BASE_URL = "http://myurl";
private Retrofit mRetrofit;
public static Service getInstance() {
return ourInstance;
}
private Service() {
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public JsonPlaceApi getJSONApi() {
return mRetrofit.create(JsonPlaceApi.class);
}
}
JsonPlaceApi.java : JsonPlaceApi.java:
public interface JsonPlaceApi {
@GET("/api/device/get/")
Call<List<Pandomats>> loadList();
}
Pandomats.java : Pandomats.java:
public class Pandomats {
@SerializedName("id")
@Expose
private String address;
@SerializedName("model")
@Expose
private String model;
@SerializedName("latitude")
@Expose
private Double latitude;
@SerializedName("longitude")
@Expose
private Double longitude;
@SerializedName("lastDeviceData")
@Expose
private LastDeviceData lastDeviceData;
@SerializedName("image")
@Expose
private Object image;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public LastDeviceData getLastDeviceData() {
return lastDeviceData;
}
public void setLastDeviceData(LastDeviceData lastDeviceData) {
this.lastDeviceData = lastDeviceData;
}
public Object getImage() {
return image;
}
public void setImage(Object image) {
this.image = image;
}
}
I need my list to be filled with getModel for example how do I implement it or where I have an error? 我需要用getModel填充列表,例如如何实现它或出现错误?
By looking into the sample JSON data format you've posted in your question I don't think that API is returning JSONArray it returns JSONObject instead. 通过查看您在问题中发布的示例JSON数据格式,我认为API不会返回JSONArray,而是会返回JSONObject 。 Anyway I'll tell you how to get the required data from parsed objects whether it's JSONArray or JSONObject.
无论如何,我都会告诉您如何从解析的对象中获取所需的数据,无论是JSONArray还是JSONObject。
You're almost near to the solution you're searching for. 您几乎可以找到所需的解决方案。 Just paste the below code inside
onResponse()
method. 只需将以下代码粘贴到
onResponse()
方法中即可。
@Override
public void onResponse(Call<List<Pandomats>> call, Response<List<Pandomats>> response) {
pandomats.addAll(response.body());
Log.v("ListPandomats", String.valueOf(pandomats.size()));
for (int i = 0; i < pandomats.size(); i++) {
Pandomats p = pandomats.get(i);
Log.v("ListPandomats", p.getModel()); // prints model
Log.v("ListPandomats", String.valueOf(p.getLatitude())); // prints latitude
}
}
Like above you can get any object from Pandomats
class. 像上面一样,您可以从
Pandomats
类中获取任何对象。 Make sure the you've initialized pandomats
ArrayList at the time of declaration or before using it inside onResponse()
method. 确保在声明时或在
onResponse()
方法中使用pandomats
ArrayList之前已初始化它。 Otherwise you'll end-up with NullPointerException
. 否则,您将最终遇到
NullPointerException
。
And also don't forget to log the error response from API inside onFailure()
method. 并且也不要忘记在
onFailure()
方法中记录来自API的错误响应。 It's very important. 这很重要。
@Override
public void onFailure(Call<List<Pandomats>> call, Throwable t) {
Log.e("ListPandomats", "Error" t);
}
As I said before I think that API is not returning JSONArray instead it reruns JSONObject. 如前所述,我认为API不会返回JSONArray而是重新运行JSONObject。 If it's returning JSONObject, you need to change the code like below.
如果返回的是JSONObject,则需要更改如下代码。
JSONApi.java JSONApi.java
public interface JsonPlaceApi {
@GET("/api/device/get/")
Call<Pandomats> loadList(); // remove List<> from return type
}
MainActivity.java MainActivity.java
Service.getInstance()
.getJSONApi()
.loadList()
.enqueue(new Callback<Pandomats>() { /* remove List<> */
@Override
public void onResponse(Call<Pandomats> call, /* remove List<> */ Response<List<Pandomats>> response) {
Pandomats p = response.body();
// without for loop iteration you can get the data
Log.v("ListPandomats", p.getModel()); // prints model
Log.v("ListPandomats", String.valueOf(p.getLatitude())); // prints latitude
}
@Override
public void onFailure(Call<Pandomats> call, Throwable t) { /* remove List<> */
Log.e("ListPandomats", "Error" t);
}
});
I hope it's clear now. 我希望现在很清楚。 If you get the error, just look into error log first.
如果发现错误,请先查看错误日志。 If don't understand it, edit the question and post error logs.
如果不理解,请编辑问题并发布错误日志。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.