[英]Gson serialization error with val in kotlin
我正在使用 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 字段值与变量名称相同的事实有关?
尝试重命名answer
参数:
class AnswerSummary(val ans: Answer) : Answer(ans.text, ans.id) { ... }
或使用answer
作为参数,而不是属性:
class AnswerSummary(answer: Answer) : Answer(answer.text, answer.id) { ... }
它会起作用,因为当您使用val
参数时,'answer' 被视为一个属性(没有val
它被视为参数)并由 Gson 使用属性名称作为序列化名称进行序列化。 同时,您的基类Answer
具有相同的序列化名称@SerializedName("answer")
,因此在序列化属性时会发生冲突。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.