gpt4 book ai didi

android - Kotlin 中带有 val 的 Gson 序列化错误

转载 作者:行者123 更新时间:2023-11-29 23:27:18 30 4
gpt4 key购买 nike

我正在使用 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") ,因此在序列化属性时会发生冲突。

关于android - Kotlin 中带有 val 的 Gson 序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53343616/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com