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

WHAT I WANT:

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

JSON FRAGMENT

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

Retrofit App 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 function:

@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).它应该表示您从服务器获得的内容.

want的对象是模型对象:其形状更符合您希望如何使用来自服务器的数据的对象.

我的意思是,这些应该是单独的课程.

// 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
    )
  )
}

Json相关问答推荐

如何获取brew list作为JSON输出

Golang JSON Date Tim.Date()测试请求

如何使用PlayWriter循环访问JSON对象

Oracle plsql:如何将json文件加载到嵌套表中

基于 JSON 字段的 Jolt 条件标志

如何在 Apache NiFi 中使用 JoltTransformJson 删除流文件或具有空字段的整个对象?

JOLT 转换仅过滤一个字段

将环境变量值从 yaml 传递到 json

阅读 JSON 正文 Firebase 云函数

从 PowerShell 编辑 Windows 终端配置文件设置 JSON

TSQL FOR JSON 嵌套值

Angular 2/Web Api - json 解析错误语法错误意外结束输入

为什么我不能在 C# 中引用 System.Runtime.Serialization.Json

如何在返回对象的 Spring MVC @RestController @ResponseBody 类中响应 HTTP 状态代码?

Rails 中奇怪的 JSON Javascript 问题

对象序列化为 JSON(使用 Gson).如何在 UpperCamelCase 中设置字段名称?

使用 jq 从 bash 中管道分隔的键和值创建 JSON

在 Jersey 服务中使用 JSON 对象

jQuery JSON 响应总是触发 ParseError

从动态 json 数据更新力有向图上的链接