标签: kotlinx.serialization

如何使用 kotlinx 序列化通过 open val 序列化 kotlin 密封类

import kotlinx.serialization.Serializable

@Serializable
sealed class Exercise(open val id: String) {

    @Serializable
    data class Theory(override val id: String) : Exercise(id)
}
Run Code Online (Sandbox Code Playgroud)

我的代码中有这样的密封类,编译器告诉我: Serializable class has duplicate serial name of property 'id', either in the class itself or its supertypes

有没有办法在可序列化的密封类中拥有 open val,在覆盖它时可以正常工作?

serialization kotlin kotlinx.serialization

9
推荐指数
1
解决办法
8040
查看次数

在 Kotlin/Native 中使用 kotlinx.serialization 进行多态反序列化

我想在 Kotlin 多平台项目中使用 kotlinx.serialization 解码包含多态类结构中的对象列表的 json 字符串,但它仅适用于 JVM,不适用于 Native。这是一个最小的可重现示例:

\n
@Serializable\nabstract class Project {\n    abstract val name: String\n}\n\n@Serializable\n@SerialName("BasicProject")\ndata class BasicProject(override val name: String): Project()\n\n@Serializable\n@SerialName("OwnedProject")\ndata class OwnedProject(override val name: String, val owner: String) : Project()\n\nfun main() {\n    val data = Json.decodeFromString<List<Project>>("""\n        [\n            {"type":"BasicProject","name":"example"},\n            {"type":"OwnedProject","name":"kotlinx.serialization","owner":"kotlin"} \n        ]\n    """))\n}  \n
Run Code Online (Sandbox Code Playgroud)\n

这适用于 JVM,但在 Native 上会引发以下异常:

\n
kotlinx.serialization.SerializationException: Serializer for class \xe2\x80\x98Project\xe2\x80\x99 is not found.\nMark the class as @Serializable or provide the serializer explicitly.\nOn Kotlin/Native explicitly declared serializer should be used for interfaces and …
Run Code Online (Sandbox Code Playgroud)

json kotlin json-deserialization kotlin-native kotlinx.serialization

9
推荐指数
1
解决办法
6484
查看次数

如何使用 kotlinx.serialization 将库类序列化为 Protobuf?

如何使用kotlinx.serialization将库类序列化为 Protobuf ?由于它不可编辑,因此我无法@SerialId按照runtime_usage.md#protobuf 中的说明为其属性添加注释。如果我像custom_serializers.md那样编写自己的外部序列化程序,它不会告诉我如何SerialId为 Protobuf 序列化指定s。

例如,我试图序列化 a java.math.BigDecimal,将其存储为unscaledValueasbytesscaleas sint32。使用原始的 Protobuf Java 库很容易做到,但我想知道如何使用kotlinx.serialization做到这一点

protocol-buffers kotlin kotlinx.serialization

8
推荐指数
1
解决办法
1118
查看次数

如何在 Kotlin 中结合 Kotlinx 序列化正确使用类继承

我有一个简单的层次结构,包含以下内容:

  • 抽象类 BaseItem
  • 开放类项目:BaseItem
  • 类别 背包 : 物品

它们都应该与 Kotlinx 序列化一起使用。一切都很顺利,直到我添加了Backpack课程。我使用1.4.32Kotlinx 序列化版本。

这是我的类层次结构的详细信息

// Items.kt

@Serializable
sealed class BaseItem {
    abstract val id: String
    abstract val type: ItemType
    abstract var brand: String
    abstract var model: String
    abstract var imageLink: String
    abstract var traits: MutableList<Trait>
    abstract var implicitTraits: MutableList<Trait>
    abstract var details: MutableMap<String, String>
}

@Serializable
open class Item(
    override val id: String = UUID.randomUUID().toString(),
    override val type: ItemType = ItemType.UNDEFINED,
    override var brand: String, …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlinx.serialization

8
推荐指数
1
解决办法
5404
查看次数

Kotlinx.Serialization 反序列化日期

我很难找到有关如何反序列化日期字段的文档。我该如何实现这一目标?我在 SO 上找到的大多数解决方案都不起作用,或者它们使用不再可用的类

@Serializable
data class Dashboard(
    val someNumber: Int,
    val someDate: Date? // Custom Deserialization from unix timestamp
)
Run Code Online (Sandbox Code Playgroud)

编辑:我发现使用的大多数解决方案PrimitiveSerialDescriptor似乎不可用

kotlin kotlinx.serialization kotlinx

8
推荐指数
2
解决办法
2万
查看次数

Kotlinx 序列化 - 忽略空值的自定义序列化程序

假设我正在上课:

@Serializable
data class MyClass(
    @SerialName("a") val a: String?,
    @SerialName("b") val b: String
)
Run Code Online (Sandbox Code Playgroud)

假设aisnullb的值为“b 值”,则Json.stringify(MyClass.serializer(), this)产生:

{ "a": null, "b": "b value" }
Run Code Online (Sandbox Code Playgroud)

基本上如果anull,我想得到这个:

{ "b": "b value" }
Run Code Online (Sandbox Code Playgroud)

从一些研究中,我发现这在 Kotlinx Serialization 中是无法开箱即用的,所以我试图构建一个自定义序列化器来显式忽略null值。我从这里开始遵循指南,但无法做出正确的指南。

有人可以照亮我吗?谢谢。

serialization kotlin json-deserialization kotlinx.serialization

7
推荐指数
2
解决办法
3428
查看次数

kotlinx 序列化:找不到缺少类鉴别器(“null”)的多态序列化器

我正在尝试序列化一个 json,但它抛出了 JsonDecodingException。检查代码:

SerializationTestCase.kt:

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import org.junit.Test

class SerializationTestCase {

    private val json = Json {
        ignoreUnknownKeys = true
        isLenient = true
        prettyPrint = true
        allowStructuredMapKeys = true
        encodeDefaults = true
        classDiscriminator = "#class"
        serializersModule = SerializersModule {
            polymorphic(Module::class) {
                subclass(TeamModule::class, TeamModule.serializer())
            }
        }
    }

    @Test
    fun test() {
        val inputJson = """
    [
        {
          "type": "team",
          "data": {
            "readOnly": true
          }
        }
    ]
""".trimIndent()

        val moduleList: List<Module> = …
Run Code Online (Sandbox Code Playgroud)

polymorphism android kotlin kotlinx.serialization kotlinx

7
推荐指数
1
解决办法
1036
查看次数

使用 Kotlinx.serialization 将 JSON 数组解析为 Map&lt;String, String&gt;

我正在编写一个 Kotlin 多平台项目(JVM/JS),我正在尝试使用 Kotlinx.serialization 将 HTTP Json 数组响应解析为 Map

JSON 是这样的:

[{"someKey": "someValue"}, {"otherKey": "otherValue"}, {"anotherKey": "randomText"}]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能够将 JSON 作为字符串获取,但是我找不到任何文档来帮助我构建 Map 或其他类型的对象。所有这些都说明了如何序列化静态对象。

我无法使用,@SerialName因为密钥未固定。

当我尝试返回 a 时Map<String, String>,出现此错误:

Can't locate argument-less serializer for class kotlin.collections.Map. For generic classes, such as lists, please provide serializer explicitly.
Run Code Online (Sandbox Code Playgroud)

最后,我想得到一个Map<String, String>或一个List<MyObject>我的对象可以在哪里MyObject(val id: String, val value: String)

有没有办法做到这一点?否则,我只想编写一个字符串阅读器来解析我的数据。

json kotlin kotlin-multiplatform kotlinx.serialization

6
推荐指数
1
解决办法
5168
查看次数

如何使用 Ktor 和 kotlinx 序列化获取 HttpCall 的状态码

我想弄清楚如何检查 http 请求的 http 状态代码 Ktor

我有一个像这样的简单 GET 请求,其中包含一个 HttpResponseObject 保存服务器返回的数据以及我控制的任何错误服务器端

val response:HttpResponseObject<MyObject> = client.get<HttpResponseObject<MyObject>>(url)
Run Code Online (Sandbox Code Playgroud)

现在我还需要能够检查的是是否存在服务器抛出的未处理异常或身份验证异常。在这些情况下,服务器不会返回任何内容,并且会返回状态代码 500 或 401 错误。

我看到文档有你可以用这样的东西获得完整的http响应

val response:HttpResponse client.get(url)
Run Code Online (Sandbox Code Playgroud)

但是如何丢失我的序列化数据回来,我找不到任何关于如何从HttpResponse对象序列化它的例子。

有没有人有什么建议?有没有办法从我的第一个示例中获取 http 状态代码?

ktor kotlinx.serialization

6
推荐指数
1
解决办法
984
查看次数

kotlinx.serialization:如何解析为与 JSON 键的确切名称不同的变量名称

使用 GSON,我们过去常常@SerializedName解析 JSON 对象,该对象与 Kotlin 中的变量名没有相同的键。

data class User (
    @SerializedName("id")
    long userId;
    @SerializedName("fullName")
    String name;
)
Run Code Online (Sandbox Code Playgroud)

kotlinx.serialization我们可以序列化这样的,但如何让在不同的JSON关键,varaible对象(德)序列化

@Serializable
data class User (
    long userId;
    String name;
)
Run Code Online (Sandbox Code Playgroud)

android json gson kotlin kotlinx.serialization

6
推荐指数
2
解决办法
2488
查看次数