Android Kotlin Moshi Custom Json Adapter

Хорошо, поэтому у меня есть следующий Json Pojo:

data class JCategory( val id: Int, val name: String, val image: String?, val color: String?, val categories: List<JCategory>?, val products: List<JProduct>? ) 

И я хочу написать таможенный десериализатор, так что конечный объект будет выглядеть так:

 data class Category( val id: Int, val name: String, val image: String?, val color: String?, val list: List<Any> ) 

В основном, отображения:

Два списка JCategory будут объединены в 1, в которых будет больше JCategory плюс Prod1 / Prod2.

Является ли это действенным и эффективным способом сопоставления данных в этом адаптере в соответствии с Moshi?

 @FromJson fun fromJson(category: JCategory): CategoryProduct { val prods = category.products val cats = category.categories val list = mutableListOf<Any>() if (prods != null && prods.size > 0) { prods.forEach { list.add(if (it.isMain == 1) { P1( ... ) } else { P2( ... ) }) } } if (cats != null && cats.size > 0){ cats.forEach { list.add(fromJson(it)) } } return CategoryProduct( category.id, category.name, category.image.emptyToNull(), parsedColor, category.parentId, list ) } 

Обратите внимание, что у меня есть JCategory и внутри списка одного и того же объекта, поэтому я подумал, что адаптер будет анализировать это автоматически, но это не так. Поэтому я попробовал list.add(fromJson(it)) и он сработал.

Поэтому мои вопросы:

  • list.add(fromJson(it)) правильный способ обработки таких случаев?
  • как я могу сопоставить объект с другим, основанным на некотором свойстве внутри него? FromJson может возвращать только один тип преобразованного объекта.

Я думаю, что рекурсия – это правильный способ обработки list(add(fromJson(it)) , основная проблема внутри структуры. Сама структура рекурсивна. Правильный способ – сгладить структуру и ссылаться на другой тип объекта.

Во-вторых, это также проблема, которая возникает с плохой структурой. Вы можете решить это с помощью общего родителя через наследование. Затем проверьте тип цели.

 interface X { } data class A : X { } data class B : X { } @FromJson fun fromJson(json: C): X { } 
Intereting Posts
Найти последнее вхождение массива String в массиве с помощью Kotlin Как написать функции расширения в Котлин? Kotlin с Spring DI: свойство lateinit не было инициализировано Android посыльный – писать с нулевым длинным Kotlin: как создать 2D-массив типа String Override getter для класса данных Kotlin Местная поздняя инициализация в Котлине Создавайте ошибки с новыми параметрами kotlin 1.1, kapt cant parse databinding params spring.config.location не работает на Spring Boot 2.0.0 M6 Неопределенность разрешения перегрузки при вызове Http.get Как я могу использовать модель представления, с sqlite и широковещательным приемником для обновления пользовательского интерфейса? Запрос на Android всегда дает исключение тайм-аута сокета RxJava 2 требует другого типа возвращаемого типа, чем RxJava 1 (Kotlin) Объем модификатора внутренней видимости в Котлине Переменные деструктурирования Kotlin не работают с Pair, Triple или классом данных