在没有自定义适配器的情况下使用Moshi解析列表

时间:2019-10-04 14:11:47

标签: android kotlin moshi

我使用的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?

1 个答案:

答案 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()
}}