【发布时间】:2019-04-19 23:34:09
【问题描述】:
我正在使用 Gson v2.8.2 和 Retrofit v2.3.0,我有两个类,Answer.kt:
open class Answer(@SerializedName("answer")
var text: String,
val id: Int)
和 AnswerSummary.kt:
class AnswerSummary(val answer: Answer) : Answer(answer.text, answer.id) {
val percent: Int = 0
}
我在列表中使用它(在 Java 中,仍在迁移到 Kotlin):
public List<AnswerSummary> getAnswerSummaries() {
return answerSummaries;
}
val 未删除时出现错误:class AnswerSummary(val answer: Answer) ...:
java.lang.IllegalArgumentException: Unable to create converter for class com.name.app.model.response.AnswerResponse
....
Caused by java.lang.IllegalArgumentException: class com.name.app.model.pojo.AnswerSummary declares multiple JSON fields named answer
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:170)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100)
at com.google.gson.Gson.getAdapter(Gson.java:423)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
....
删除 'val': class AnswerSummary(answer: Answer) ... 后,错误消失。为什么会这样,因为我只注释了一个字段? -@SerializedName("answer") var text: String。
我找到了一种在保持不变性('val')的同时规避崩溃的方法 - 通过使用不同的变量名:class AnswerSummary(val ans: Answer) ...。后台发生了什么 - 是否与 @SerializedName 字段值与变量名相同这一事实有关?
【问题讨论】:
-
AnswerSummary declares multiple JSON fields named answer将AnswerSummary(val answer: Answer)中的val answer重命名为其他名称。 -
我提到当我使用不同的变量名时我会避免崩溃:
class AnswerSummary(val ans: Answer),我在问发生了什么:为什么我必须删除'val ' or 改变变量名? -
因为 Retrofit 无法为类 com.name.app.model.response.AnswerResponse 创建转换器,因为 AnswerSummary 声明了多个名为 answer 的 JSON 字段。你会在改造的地方做什么? :)
标签: android kotlin serialization gson retrofit2