Как преобразовать массив карт в список?

Селектаблимажемодель:

public class SelectableImageModel {

    @PropertyName("FILE_NAME")
    public String fileName;
    @PropertyName("DURATION")
    public int duration;
    @PropertyName("EXPIRATION_DATE")
    public String expirationDate;

    @PropertyName("FILE_NAME")
    public String getFileName() {
        return fileName;
    }

    @PropertyName("FILE_NAME")
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    @PropertyName("DURATION")
    public int getDuration() {
        return duration;
    }

    @PropertyName("DURATION")
    public void setDuration(int duration) {
        this.duration = duration;
    }

    @PropertyName("EXPIRATION_DATE")
    public String getExpirationDate() {
        return expirationDate;
    }

    @PropertyName("EXPIRATION_DATE")
    public void setExpirationDate(String expirationDate) {
        this.expirationDate = expirationDate;
    }

}

Код

if (documentSnapshot.get("IMAGES") != null) {
    List<SelectableImageModel> imagesList = (List<SelectableImageModel>) documentSnapshot.get("IMAGES");
    Log.w("ABC", "... " + documentSnapshot.get("IMAGES"));
    Log.w("ABC", "... " + documentSnapshot.get("IMAGES").getClass());
    Log.w("ABC", "... " + documentSnapshot.get("IMAGES").getClass().getName());
    Log.w("ABC", imagesList == null ? "null" : "notnull");
    Log.w("ABC", ". " + imagesList.size()); //Output is 3
    Log.w("ABC", ". " + imagesList.get(0));
    try {
        Log.w("ABC", imagesList.get(0).getFileName().getClass().getName());
    } catch (Exception e) {
        Log.w("ABC", "... " + e); // Always print this exception -> java.lang.ClassCastException: java.util.HashMap cannot be cast to com.xxx.adminpanel.app.models.SelectableImageModel
    }
}

Поле IMAGES представляет собой массив, в котором каждый элемент представляет собой карту. Как видно из приведенного выше кода, я пытаюсь преобразовать этот массив в список. Однако я столкнулся с исключением. Что мне не хватает?

Это не удается: (List<SelectableImageModel>) documentSnapshot.get("IMAGES"); Вы не можете напрямую передавать данные документа в пользовательский класс Java. Вы должны вручную заполнить класс, вытащив каждое поле из моментального снимка документа и поместив его в класс. Поля документа всегда будут только String, Long, Double, Timestamp, Boolean, DocumentReference, Map<Object>, List<Object>.

Doug Stevenson 20.02.2023 18:05

@DougStevenson Надеюсь, вы сможете предоставить решение в виде кода, чтобы точно продемонстрировать, что вы имеете в виду.

Taha Sami 20.02.2023 18:38

Предлагаю просмотреть документацию о том, как работать с данными, поступающими из снимков документов. Это довольно просто. Я также рекомендую обновить ваш вопрос, чтобы лучше понять, где вы застряли с этим.

Doug Stevenson 20.02.2023 18:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод DocumentSnapshot#get(String field) возвращает объект типа Object. Таким образом, следующая строка кода определенно потерпит неудачу:

(List<SelectableImageModel>) documentSnapshot.get("IMAGES");

Потому что в Java вы не можете выполнить такое приведение. Однако, если вы попытаетесь выполнить такое приведение, вы, скорее всего, получите ClassCastException. Чтобы получить массив IMAGES в виде List<SelectableImageModel>, я рекомендую вам создать еще один класс, который выглядит так:

public class Document {
    public List<SelectableImageModel> imagesList;
}

И чтобы прочитать документ, вы должны вместо этого использовать метод DocumentSnapshot#toObject(Class valueType). Итак, в коде это должно выглядеть так:

List<SelectableImageModel> imagesList = documentSnapshot.toObject(Document.class).imagesList;

Итак, сначала вам нужно преобразовать объект DocumentSnapshot в объект типа Document, а затем прочитать общедоступное поле imagesList изнутри объекта. Для получения дополнительной информации я также рекомендую вам прочитать этот ресурс.

Другие вопросы по теме