繁体   English   中英

kotlin中val的Gson序列化错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM