当前位置: 首页 > 知识库问答 >
问题:

kotlin中val的Gson序列化错误

于嘉许
2023-03-14

我使用的是Gson v2。8.2和改造v2。我有两门课,答案是。kt:

open class Answer(@SerializedName("answer")
                  var text: String,
                  val id: Int)

答案ummary.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 Answer摘要(val答案:答案)...

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(答案:答案) ,错误消失。为什么会这样,因为我只注释了一个字段?-@SerializedName(“应答”)变量文本:String

我找到了一种在保持不变性(“val”)的同时避免崩溃的方法——使用不同的变量名:class AnswerSummary(val-ans:Answer) 。后台发生的事情——是否与@SerializedName字段值与变量名相同有关?


共有1个答案

邵羽
2023-03-14

尝试重命名应答参数:

class AnswerSummary(val ans: Answer) : Answer(ans.text, ans.id) { ... }

或者使用答案作为参数,而不是属性:

class AnswerSummary(answer: Answer) : Answer(answer.text, answer.id) { ... }

它将工作,因为当您使用val参数时,答案被认为是一个属性(没有val它被认为是参数),并由Gson使用属性名称作为序列化名称进行序列化。同时,您的基类答案中具有相同的序列化名称@SerializedName("答案"),因此在序列化属性时存在冲突。

 类似资料:
  • ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为java.util.HashMap 提前谢了。

  • 我需要序列化/反序列化特定枚举: 我有个例外: 我如何通过GSON序列化/反序列化它?

  • 问题内容: 使用Gson 2.2.2,我正在尝试序列化POJO(行为)的数组列表。 我有一个适配器,几乎是我在网上看到的一个副本: 我这样注册: 然后,当我尝试序列化我的ArrayList时: 我出现堆栈溢出。 似乎在线上: 它开始递归循环,一次又一次地通过我的序列化器。那么,我该如何注册它以免发生这种情况?我需要序列化列表并保持多态性。 问题答案: 看起来您发现了JsonSerializer文档

  • 主要内容:1. 数组,2. 集合,3. 泛型在本章中,我们将讨论和学习如何使用数组,集合和泛型的序列化/反序列化。 1. 数组 示例 我们来看看数组的序列化/反序列化。 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 2. 集合 让我们看看集合()序列化/反序列化的实际操作。 创建一个名为的Java类文件: GsonTester.java - 执行上面示例代码,得到以下结果 - 3. 泛

  • 主要内容:示例我们将一个Java对象序列化为一个Json文件,然后读取该Json文件以获取对象。 在这个例子中,创建一个类。 然后将对象列化后存储在文件中,该文件将具有对象的json表示形式。 示例 在中创建一个名为的Java类文件,参考以下代码 - 执行上面示例代码,得到以下结果 -

  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。