Kotlin Android中用Moshi将不规则JSON转为List<Itinerary0>
解决Retrofit中不规则JSON转List的问题
步骤1:替换Gson为Moshi依赖
先在项目模块级别的build.gradle里替换依赖,移除原Gson转换器,添加Moshi相关依赖:
// 移除Gson转换器 // implementation 'com.squareup.retrofit2:converter-gson:x.x.x' // 添加Moshi及Kotlin适配(Kotlin项目用) implementation 'com.squareup.moshi:moshi:1.14.0' implementation 'com.squareup.moshi:moshi-kotlin:1.14.0' implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
步骤2:定义目标数据类
摒弃原来逐个声明itinerary_0到itinerary_9的写法,改成包含列表的ItineraryData:
@JsonClass(generateAdapter = true) data class ItineraryData( val itineraries: List<Itinerary0> ) // 你的Itinerary0数据类保持原有字段结构即可 @JsonClass(generateAdapter = true) data class Itinerary0( val flightNumber: String, val departureTime: String, // 其他业务字段... )
步骤3:编写自定义Moshi适配器
针对API返回的itinerary_*格式字段,写一个适配器把这类字段统一转成列表:
class ItineraryDataAdapter(private val itineraryAdapter: JsonAdapter<Itinerary0>) : JsonAdapter<ItineraryData>() { override fun fromJson(reader: JsonReader): ItineraryData { val itineraries = mutableListOf<Itinerary0>() reader.beginObject() while (reader.hasNext()) { val key = reader.nextName() // 筛选出以"itinerary_"开头的字段 if (key.startsWith("itinerary_")) { itineraryAdapter.fromJson(reader)?.let { itineraries.add(it) } } else { // 跳过无关字段 reader.skipValue() } } reader.endObject() return ItineraryData(itineraries) } override fun toJson(writer: JsonWriter, value: ItineraryData?) { // 若不需要序列化该对象,直接抛出异常或留空 throw UnsupportedOperationException("序列化暂不支持") } }
步骤4:绑定适配器到数据类
在ItineraryData类上添加注解,指定使用自定义适配器:
@JsonAdapter(ItineraryDataAdapter::class) data class ItineraryData( val itineraries: List<Itinerary0> )
步骤5:修改Retrofit配置
把原来的Gson转换器换成Moshi转换器,同时创建包含Kotlin适配的Moshi实例:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .build() val retrofit = Retrofit.Builder() .baseUrl("你的API基础地址") .addConverterFactory(MoshiConverterFactory.create(moshi)) .build()
完成以上配置后,Retrofit就能自动将返回的不规则JSON转换成包含List<Itinerary0>的ItineraryData对象。
内容的提问来源于stack exchange,提问作者deja
相关产品推荐
相关产品推荐

