我想从Retrofit2获得的JSON数组中获取特定对象的列表.我该怎么做呢



json结构P.S参考不是动态的,因此只有一个JSON数据阵列;

我在文档上做了所有操作

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:

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:

public interface JsonPlaceApi {
@GET("/api/device/get/")
Call<List<Pandomats>> loadList();
}

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;
    }
}

我需要我的列表填充getModel,例如如何实现它或有错误的地方?

通过查看您在问题中发布的示例JSON数据格式,我认为API不返回JSONARRAY,它返回 JSONOBJECT 。无论如何,我会告诉您如何从解析对象中获取所需的数据,无论是JSONARRAY还是JSONOBJECT。

您几乎靠近要搜索的解决方案。只需在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
     }
}

就像上面一样,您可以从Pandomats类获取任何对象。确保您在声明时或在onResponse()方法中使用它之前或在使用它之前初始化了pandomats ArrayList。否则您将使用NullPointerException

也不要忘记记录onFailure()方法内API的错误响应。这非常重要。

@Override
public void onFailure(Call<List<Pandomats>> call, Throwable t) {
    Log.e("ListPandomats", "Error" t);
}

正如我在我认为API没有返回JSONARRAY之前所说的那样,它重新播放了JSONOBJECT。如果返回JSONOBJECT,则需要更改下面的代码。

jsonapi.java

public interface JsonPlaceApi {
    @GET("/api/device/get/")
    Call<Pandomats> loadList();  // remove List<> from return type 
}

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);
        }
    });

我希望现在很清楚。如果收到错误,只需先查看错误日志即可。如果不理解,请编辑问题并发布错误日志。

最新更新