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

用Moshi序列化密封类

田玉韵
2023-03-14

以下内容将生成一个IllegalArgumentException,因为您“无法序列化抽象类”

sealed class Animal {
    data class Dog(val isGoodBoy: Boolean) : Animal()
    data class Cat(val remainingLives: Int) : Animal()
}

private val moshi = Moshi.Builder()
    .build()

@Test
fun test() {
    val animal: Animal = Animal.Dog(true)
    println(moshi.adapter(Animal::class.java).toJson(animal))
}

我尝试过使用自定义适配器来解决这个问题,但我能找到的唯一解决方案是显式地为每个子类编写所有的属性名。例如:

class AnimalAdapter {
    @ToJson
    fun toJson(jsonWriter: JsonWriter, animal: Animal) {
        jsonWriter.beginObject()
        jsonWriter.name("type")
        when (animal) {
            is Animal.Dog -> jsonWriter.value("dog")
            is Animal.Cat -> jsonWriter.value("cat")
        }

        jsonWriter.name("properties").beginObject()
        when (animal) {
            is Animal.Dog -> jsonWriter.name("isGoodBoy").value(animal.isGoodBoy)
            is Animal.Cat -> jsonWriter.name("remainingLives").value(animal.remainingLives)
        }
        jsonWriter.endObject().endObject()
    }

    ....
}

最终,我希望生成如下所示的JSON:

{
    "type" : "cat",
    "properties" : {
        "remainingLives" : 6
    }
}
{
    "type" : "dog",
    "properties" : {
        "isGoodBoy" : true
    }
}

我很乐意使用自定义适配器来编写每个类型的名称,但我需要一个解决方案,它将自动序列化每个类型的属性,而不是手动编写它们。

共有1个答案

程昕
2023-03-14

我认为您需要多态适配器来实现这一点,这需要moshi-adapters工件。这将启用具有不同属性的密封类的序列化。更多细节请参见本文:https://proandroiddev.com/moshi-polymorphic-adapter-is-d25deebbd7c5

 类似资料:
  • 我正在Android上使用Moshi 1.8.0,并按照Moshi文档中的说明创建自定义字段:https://github.com/square/Moshi#custom-field-names-with-json 这意味着我的请求数据类是这样的: 但问题是实际的HTTP请求是这样发送的: 我所期待的是我的请求是这样的: 这似乎对响应工作得很好,但我不知道如何使它对请求工作。 谢谢!这难道不是注释

  • 想象一下这个数据示例 我想要注意的是,完整的json要比这个大得多。然而,这是我唯一的问题。我也有一些枚举问题,但可以用字符串替换 我收到的错误是error:@JSONClass不能应用于NET......activity.Value:必须不是密封的公共静态抽象类值 因此,我的问题是,如何使用多个枚举类型解码json。 调用数据

  • 下面是虚拟数据和单元测试

  • 下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?

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