Разбор списка с Moshi без кастомного адаптера - PullRequest
0 голосов
/ 04 октября 2019

Я использую 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 голосов
/ 07 ноября 2019

Вы должны сделать специальный адаптер для разбора 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()
}}
...