在我的应用程序中,我正在使用 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
您的 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
)
)
}