gson Kotlin序列化@SerialName对布尔值无效

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

我正在使用GSON序列化一些平台数据。当我使用@SerialName在我的应用中捕获具有不同命名约定的平台数据时,它适用于其他类型,但不适用于Boolean类型。举个简单的例子,如果我有一个类,如...

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class Person (
    @SerialName("first_name") val firstName: String? = null,
    @SerialName("last_name") val lastName: String? = null,
    val age: Int? = null
)

...一切正常。序列化程序在数据中找到first_namelast_nameage,并正确设置了Person的属性。
但是,当我尝试添加一个Boolean时...

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class Person (
    @SerialName("first_name") val firstName: String? = null,
    @SerialName("last_name") val lastName: String? = null,
    val age: Int? = null,
    @SerialName("can_sing") val canSing: Boolean? = null
)

...序列化程序没有捕获和分配can_sing。奇怪的是,它可以处理String,但不能处理Boolean。有什么可以解释为什么我会看到这种行为吗?我可以解决这个问题(例如,我可以执行val can_sing: Boolean? = null,而且它可以工作),但我只是想知道为什么@SerialName似乎不适用于Boolean,或者我只是忽略了一些明显东西。

igsr9ssn

igsr9ssn1#

您混合了Gson和Kotlin注解类型- Gson使用@SerializedName而不是@SerialName。我不确定在这种情况下字符串类型如何工作(可能是您如何调用Gson的问题中没有包括的内容)。
例如,这里的第一个类(Person)可以用Kotlin序列化库序列化,第二个类可以用Gson:

  • Kotlin注解 *
@Serializable
data class Person (
    @SerialName("first_name") val firstName: String? = null,
    @SerialName("last_name") val lastName: String? = null,
    val age: Int? = null,
    @SerialName("can_sing") val canSing: Boolean? = null
)
  • Gson注解 *
data class PersonGson (
    @SerializedName("first_name") val firstName: String? = null,
    @SerializedName("last_name") val lastName: String? = null,
    val age: Int? = null,
    @SerializedName("can_sing") val canSing: Boolean? = null
)

示例

使用Kotlin序列化库运行此单元测试:

@Test
fun testJsonKotlin()  {
    val test = Person("hello", "world", 42, false)
    val json = Json.encodeToString(test)
    println(json)
    val t2 = Json.decodeFromString<Person>(json)
    println(t2)
}

产生预期的输出:

{"first_name":"hello","last_name":"world","age":42,"can_sing":false}
Person(firstName=hello, lastName=world, age=42, canSing=false)

和Gson做那个

@Test
fun testJsonGsonMixed()  {
    val testp = Person("hello", "world", 42, false)
    val json = Gson().toJson(testp)
    println(json)
    val t2 = Gson().fromJson(json, Person::class.java)
    println(t2)
}

技术上可以工作,但忽略序列化名称注解(适用于所有情况,而不仅仅是布尔值)

{"firstName":"hello","lastName":"world","age":42,"canSing":false}
Person(firstName=hello, lastName=world, age=42, canSing=false)

将带Gson注解的类与Gson一起使用

@Test
fun testJsonGson()  {
    val test = PersonGson("hello", "world", 42, false)
    val json = Gson().toJson(test)
    println(json)
    val t2 = Gson().fromJson(json, PersonGson::class.java)
    println(t2)
}

再次给出正确的响应

{"first_name":"hello","last_name":"world","age":42,"can_sing":false}
PersonGson(firstName=hello, lastName=world, age=42, canSing=false)

相关问题