我对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"}""")
}