Kotlin 的 Json.decodeFromString 如何在没有第一个反序列化策略参数的情况下工作?



我对Kotlin很陌生,很好奇是什么魔法让这个代码发挥作用:

发件人https://github.com/Kotlin/kotlinx.serialization/blob/e2e764a132c8eebd31208120774baf9a71ec23c7/formats/json/commonTest/src/kotlinx/serialization/SerializerForNullableTypeTest.kt

@Serializable
data class Box(val s: StringHolder?)
val deserialized = Json.decodeFromString<Box>(string)

当函数定义似乎需要在编码的JSON字符串之前有一个初始参数时。

https://github.com/Kotlin/kotlinx.serialization/blob/e2e764a132c8eebd31208120774baf9a71ec23c7/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt

public final override fun <T> decodeFromString(deserializer: DeserializationStrategy<T>, string: String): T {

添加下面的导入对我有效。

import kotlinx.serialization.decodeFromString

Kotlin官方文件

该方法目前是SerialFormat.kt:中API实验的一部分

它是一个具有以下接口的扩展功能:

@OptIn(ExperimentalSerializationApi::class)
public inline fun <reified T> StringFormat.encodeToString(value: T): String

你需要启用实验API才能使用它

要使用它,您需要导入import kotlinx.serialization.decodeFromString。但由于这是一个实验性的API,您还需要用@ExperimentalSerializationApi标记您的类或方法。但是,要启用实验性开关,还需要通过languageSettings.optIn("kotlin.RequiresOptIn")添加一个编译器。

build.gradle.kts

plugins {
kotlin("jvm") version "1.5.31"
kotlin("plugin.serialization") version "1.5.31"
}
kotlin.sourceSets.all {
languageSettings.optIn("kotlin.RequiresOptIn")
}

test.kts

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerialFormat
import kotlinx.serialization.json.Json
import kotlinx.serialization.decodeFromString
@Serializable
data class Box(val s: String = "")
@OptIn(ExperimentalSerializationApi::class)
fun readJson(){
val deserialized = Json.decodeFromString<Box>("""{"s" : "Hallo"}""")
}

最新更新