Moshi-Codegen, выдающий ArrayIndexOutOfBoundsException Ошибка с универсальным классом - PullRequest
0 голосов
/ 24 сентября 2019

Я использую кодировку Moshi в проекте, который я выполняю, и получаю ошибку java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 в сгенерированном универсальном классе JsonAdapter для ApiResponse.

ApiResponse.kt Здесь ApiResponse имеет @JsonClass (generateAdapter = true)аннотация для генерации JsonAdapter.

@JsonClass(generateAdapter = true)
data class ApiResponse<T>(@Json(name = "header") var header: Header?, @Json(name = "body") var body: T? = null) {

    @JsonClass(generateAdapter = true)
    data class Header(
        @Json(name = "responseCode") var responseCode: Int,
        @Json(name = "customerMessage") var customerMessage: String,
    )
}

Сгенерированный ApiResponseJsonAdapter.kt

class ApiResponseJsonAdapter<T>(moshi: Moshi, types: Array<Type>) : JsonAdapter<ApiResponse<T>>() {
    private val options: JsonReader.Options = JsonReader.Options.of("header", "body")

    private val nullableHeaderAdapter: JsonAdapter<ApiResponse.Header?> =
            moshi.adapter<ApiResponse.Header?>(ApiResponse.Header::class.java, kotlin.collections.emptySet(), "header")

    private val nullableTNullableAnyAdapter: JsonAdapter<T?> =
            moshi.adapter<T?>(types[0], kotlin.collections.emptySet(), "body")

    override fun toString(): String = "GeneratedJsonAdapter(ApiResponse)"

    override fun fromJson(reader: JsonReader): ApiResponse<T> {
        var header: ApiResponse.Header? = null
        var body: T? = null
        var bodySet: Boolean = false
        reader.beginObject()
        while (reader.hasNext()) {
            when (reader.selectName(options)) {
                0 -> header = nullableHeaderAdapter.fromJson(reader)
                1 ->  {
                    body = nullableTNullableAnyAdapter.fromJson(reader)
                    bodySet = true
                }
                -1 -> {
                    // Unknown name, skip it.
                    reader.skipName()
                    reader.skipValue()
                }
            }
        }
        reader.endObject()
        var result = ApiResponse<T>(
                header = header)
        result = result.copy(
                body = if (bodySet) body else result.body)
        return result
    }

    override fun toJson(writer: JsonWriter, value: ApiResponse<T>?) {
        if (value == null) {
            throw NullPointerException("value was null! Wrap in .nullSafe() to write nullable values.")
        }
        writer.beginObject()
        writer.name("header")
        nullableHeaderAdapter.toJson(writer, value.header)
        writer.name("body")
        nullableTNullableAnyAdapter.toJson(writer, value.body)
        writer.endObject()
    }
}

ApiAdapterFactory

val type = Types.newParameterizedType(ApiResponse::class.java)
val adapter = Moshi.Builder().build().adapter<ApiResponse<T>>(type)
val apiResponse = adapter.fromJson(jsonResponse) as ApiResponse<T>

when (response.code()) {
          200 -> Result.Success(apiResponse, null)
          else -> Result.Failure(ApiError())
}

Поэтому, когда я пытаюсь получить ApiResponse из ответа JsonЯ получаю сообщение об ошибке ArrayIndexOutOfBoundsException в файле ApiResponseJsonAdapter.kt при инициализации переменной « nullableTNullableAnyAdapter ».

Что здесь может быть не так?

...