我使用的API会以数组形式返回数据,例如JSON字符串(我们称其为“任务”)
[
{"id": "5d9478a643a7520041b367c7",
"name": "Task 1",
"value": 2
},
{"id": "5d9478a243a7520041b367c6",
"name": "Task 2",
"value": 10
},
]
我想将此响应解析为列表。所以我用生成的适配器创建了相应的数据类
@JsonClass(generateAdapter = true)
data class Task(
var id: String,
var name: String,
var value: Int
)
我的改造服务看起来像这样
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()
interface NetworkService {
@GET("tasks")
suspend fun tasks(): Response<List<Task>>
}
但是我想使用一个容器类型,例如:
data class TaskList(val tasks: List<Task>)
作为网络响应结果。是否可以在不创建自定义适配器的情况下实现?否则,我将需要创建自定义适配器并将其传递给moshi builder?
答案 0 :(得分:0)
您必须制作一个特定的适配器才能解析这样的JSON
class YourAdapter {
@FromJson
fun fromJson(reader: JsonReader, jsonAdapter: JsonAdapter<YourResponse>): List<YourResponse>? {
val list = ArrayList<YourLResponse>()
if (reader.hasNext()) {
val token = reader.peek()
if (token == JsonReader.Token.BEGIN_ARRAY) {
reader.beginArray()
while (reader.hasNext()) {
val yourResponse = jsonAdapter.fromJsonValue(reader.readJsonValue())
YoutResponse?.let {
list.add(yourResponse)
}
}
reader.endArray()
}
}
return list.toList()
}}