Как преобразовать список свойств в Kotlin data class из json ответа в список объектов?

Имеется следующий data class в модели:

data class Forecast(
    @SerializedName("2021-09-04")
    val x20210904: X20210904,
    @SerializedName("2021-09-05")
    val x20210905: X20210905,
    @SerializedName("2021-09-06")
    val x20210906: X20210906,
    @SerializedName("2021-09-07")
    val x20210907: X20210907,
    @SerializedName("2021-09-08")
    val x20210908: X20210908,
    @SerializedName("2021-09-09")
    val x20210909: X20210909,
    @SerializedName("2021-09-10")
    val x20210910: X20210910
)

Хотелось бы получить список объектов:

data class ForecastList {
 val forecastList: List<ForecastList>
}

Т.е. если создать пустой список:

val forecast=mutableListOf<ForecastList> 

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

в json это предоставляется не в виде списка, а отдельными свойствами:

"forecast": {
        "2021-09-04": {
            "date": "2021-09-04",
            "date_epoch": 1630713600,
            "astro": {
                "sunrise": "06:01 AM",
                "sunset": "07:53 PM",
                "moonrise": "01:19 AM",
                "moonset": "07:59 PM",
                "moon_phase": "New Moon",
                "moon_illumination": 0
            },
            "mintemp": 5,
            "maxtemp": 11,
            "avgtemp": 8,
            "totalsnow": 0,
            "sunhour": 9.8,
            "uv_index": 2
        },
        "2021-09-05": {
            "date": "2021-09-05",
            "date_epoch": 1630800000,
            "astro": {
                "sunrise": "06:03 AM",
                "sunset": "07:50 PM",
                "moonrise": "02:49 AM",
                "moonset": "08:10 PM",
                "moon_phase": "Waxing Crescent",
                "moon_illumination": 0
            },
            "mintemp": 3,
            "maxtemp": 13,
            "avgtemp": 8,
            "totalsnow": 0,
            "sunhour": 12.8,
            "uv_index": 3
        },
        "2021-09-06": {
            "date": "2021-09-06",
            "date_epoch": 1630886400,
            "astro": {
                "sunrise": "06:06 AM",
                "sunset": "07:47 PM",
                "moonrise": "04:23 AM",
                "moonset": "08:17 PM",
                "moon_phase": "Waxing Crescent",
                "moon_illumination": 7
            },
            "mintemp": 4,
            "maxtemp": 14,
            "avgtemp": 10,
            "totalsnow": 0,
            "sunhour": 9.8,
            "uv_index": 1
        },
        "2021-09-07": {
            "date": "2021-09-07",
            "date_epoch": 1630972800,
            "astro": {
                "sunrise": "06:08 AM",
                "sunset": "07:44 PM",
                "moonrise": "05:58 AM",
                "moonset": "08:22 PM",
                "moon_phase": "Waxing Crescent",
                "moon_illumination": 14
            },
            "mintemp": 8,
            "maxtemp": 16,
            "avgtemp": 12,
            "totalsnow": 0,
            "sunhour": 10.3,
            "uv_index": 2
        },
        "2021-09-08": {
            "date": "2021-09-08",
            "date_epoch": 1631059200,
            "astro": {
                "sunrise": "06:10 AM",
                "sunset": "07:41 PM",
                "moonrise": "07:33 AM",
                "moonset": "08:27 PM",
                "moon_phase": "Waxing Crescent",
                "moon_illumination": 21
            },
            "mintemp": 7,
            "maxtemp": 16,
            "avgtemp": 13,
            "totalsnow": 0,
            "sunhour": 9.8,
            "uv_index": 2
        },
        "2021-09-09": {
            "date": "2021-09-09",
            "date_epoch": 1631145600,
            "astro": {
                "sunrise": "06:13 AM",
                "sunset": "07:38 PM",
                "moonrise": "09:09 AM",
                "moonset": "08:31 PM",
                "moon_phase": "First Quarter",
                "moon_illumination": 28
            },
            "mintemp": 9,
            "maxtemp": 17,
            "avgtemp": 11,
            "totalsnow": 0,
            "sunhour": 4.8,
            "uv_index": 3
        },
        "2021-09-10": {
            "date": "2021-09-10",
            "date_epoch": 1631232000,
            "astro": {
                "sunrise": "06:15 AM",
                "sunset": "07:35 PM",
                "moonrise": "10:46 AM",
                "moonset": "08:36 PM",
                "moon_phase": "First Quarter",
                "moon_illumination": 34
            },
            "mintemp": 10,
            "maxtemp": 20,
            "avgtemp": 15,
            "totalsnow": 0,
            "sunhour": 10.4,
            "uv_index": 4
        }

Ответы (1 шт):

Автор решения: IR42

Для такого json вам не нужно создавать новый класс на каждое значение. Собираетесь каждую неделю перекомпиливать приложение? Используйте Map<String, Day>, где Day(можете назвать как угодно) соответствует этому json:

{
    "date": "2021-09-04",
    "date_epoch": 1630713600,
    "astro": {
        "sunrise": "06:01 AM",
        "sunset": "07:53 PM",
        "moonrise": "01:19 AM",
        "moonset": "07:59 PM",
        "moon_phase": "New Moon",
        "moon_illumination": 0
    },
    "mintemp": 5,
    "maxtemp": 11,
    "avgtemp": 8,
    "totalsnow": 0,
    "sunhour": 9.8,
    "uv_index": 2
}

Forecast по сути является Map<String, Day>, поэтому можно сделать typealias. Так это будет выглядеть с классом, в котором содержится "forecast" объект:

typealias Forecast = Map<String, Day>

data class MyClass(
    @SerializedName("forecast")
    val forecast: Forecast
)

Дальше из этой мапы достаёте значения по нужной дате или используете коллекцию, полученную через entries или values

→ Ссылка