我正在使用Gson v2.8.2和Retrofit v2.3.0,我有两个类,答案.kt:
open class Answer(@SerializedName("answer")
var text: String,
val id: Int)
和应答摘要。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字段值与变量名相同这一事实有关?
1条答案
按热度按时间ckocjqey1#
尝试重命名
answer
参数:或者使用
answer
作为参数,而不是属性:因为当您使用
val
时,参数'answer'被视为属性(没有val
时,它被视为参数),并由Gson使用属性名称作为序列化名称进行序列化。同时,您在基类Answer
中具有相同的序列化名称@SerializedName("answer")
,因此在序列化属性时存在冲突。