Я хочу получить список конкретных объектов из массива json, который я получаю с Retrofit2. Как мне это сделать? - PullRequest
0 голосов
/ 28 июня 2019

Структура Json PS Ссылка не является динамической, поэтому существует только массив данных 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, например, как мне его реализовать или где у меня ошибка?

1 Ответ

0 голосов
/ 29 июня 2019

Рассматривая пример формата данных 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. Убедитесь, что вы инициализировали pandomats ArrayList во время объявления или перед использованием его внутри onResponse() метода. В противном случае вы получите NullPointerException.

А также не забудьте записать ответ об ошибке из API внутри метода onFailure(). Это очень важно.

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

Надеюсь, теперь все ясно. Если вы получили ошибку, просто загляните в журнал ошибок. Если не понимаете, отредактируйте вопрос и опубликуйте журналы ошибок.

...