Kotlin中瓦尔的Gson序列化错误

cig3rfwq  于 2022-11-06  发布在  Kotlin
关注(0)|答案(1)|浏览(191)

我正在使用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字段值与变量名相同这一事实有关?

ckocjqey

ckocjqey1#

尝试重命名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"),因此在序列化属性时存在冲突。

相关问题