【问题标题】:Parse list with Moshi without custom adapter使用没有自定义适配器的 Moshi 解析列表
【发布时间】:2020-02-02 21:24:06
【问题描述】:

我使用一个以数组形式返回数据的 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?

【问题讨论】:

  • 您是否尝试将Response&lt;List&lt;Task&gt;&gt; 更改为Response&lt;TaskList&gt;
  • @Neo 问之前你自己试过了吗?不行,请看JSON字符串,你看到里面有“tasks”数组了吗?

标签: android kotlin moshi


【解决方案1】:

你必须制作一个特定的适配器才能解析这样的 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()
}}

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2017-02-08
    • 1970-01-01
    • 2017-03-09
    • 2021-04-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多