将 JSON 字符串解析为 Kotlin Android 中的对象列表(MOSHI?)

问题描述 投票:0回答:1

在我的应用程序中,我正在使用 Retrofit 从 API 获取数据(包含航班数据)。我想从 JSON 获取 List< Itinerary >,但问题是它的格式不正确,我正在单独获取行程。我听说可以使用 Moshi 库来做到这一点,但我不知道该怎么做。

data class ItineraryData(
    val itinerary_0: Itinerary0,
    val itinerary_1: Itinerary0,
    val itinerary_2: Itinerary0,
    val itinerary_3: Itinerary0,
    val itinerary_4: Itinerary0,
    val itinerary_5: Itinerary0,
    val itinerary_6: Itinerary0,
    val itinerary_7: Itinerary0,
    val itinerary_8: Itinerary0,
    val itinerary_9: Itinerary0,
)

我想要什么:

data class ItineraryData(
    val itineraries: List<Itinerary0>
)

JSON 片段

"itinerary_data" : {
      "itinerary_0": {...},
      "itinerary_1": {...},
      "itinerary_2": {...},
      "itinerary_3": {...},
      "itinerary_4": {...},
      "itinerary_5": {...},
      "itinerary_6": {...},
      "itinerary_7": {...},
      "itinerary_8": {...},
      "itinerary_9": {...},
}"

Retrofit 应用程序 API:

@Provides
    @Singleton
    fun provideFlightApi(): FlightApi {

        val loggingInterceptor = HttpLoggingInterceptor().apply {
            level = HttpLoggingInterceptor.Level.BODY
        }

        val client = OkHttpClient.Builder()
            .addInterceptor(loggingInterceptor)
            .build()

        return Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
            .create(FlightApi::class.java)
    }

getFlights 函数:

@GET(value = "v2/flight/departures")
    suspend fun getFlights(
        @Query("rapidapi-key") apiKey: String = BuildConfig.API_KEY,
        @Query("departure_date") date: String,
        @Query("adults") passengers: Int,
        @Query("sid") sid: String = "SIFjfID63",
        @Query("origin_city_id") cityDep: String,
        @Query("destination_city_id") cityArr: String,
        @Query("number_of_itineraries") itinerariesCount: Int = 1
    ) : ApiResponse2
android json kotlin retrofit moshi
1个回答
0
投票

您的 ItineraryData 是数据传输对象 (DTO)。它应该代表您从服务器获得的内容。

想要的是一个模型对象:一个形状更符合你想如何使用来自服务器的数据的对象。

恕我直言,那些应该是单独的课程。

// how you want to use the data
data class ItineraryModel(
    val itineraries: List<Itinerary0>
)

// how your server wants to give you the data
data class ItineraryData(
    val itinerary_0: Itinerary0,
    val itinerary_1: Itinerary0,
    val itinerary_2: Itinerary0,
    val itinerary_3: Itinerary0,
    val itinerary_4: Itinerary0,
    val itinerary_5: Itinerary0,
    val itinerary_6: Itinerary0,
    val itinerary_7: Itinerary0,
    val itinerary_8: Itinerary0,
    val itinerary_9: Itinerary0,
) {
  // how you convert between the two
  fun toModel() = ItineraryModel(
    listOf(
      itinerary_0,
      itinerary_1,
      itinerary_2,
      itinerary_3, 
      itinerary_4,
      itinerary_5,
      itinerary_6,
      itinerary_7,
      itinerary_8,
      itinerary_9
    )
  )
}
© www.soinside.com 2019 - 2024. All rights reserved.