From 1c5a03452527024e773e3adc005d2ea678c2eee6 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Fri, 8 Nov 2024 18:15:10 +0100 Subject: [PATCH] Add inline reified version of encodeToString as a Json member to to streamline experience for newcomers. decodeFromString was already there for @FormatLanguage reasons. Fixes #2850 --- .../api/kotlinx-serialization-json.klib.api | 1 + .../src/kotlinx/serialization/json/Json.kt | 58 ++++++++++++++----- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/formats/json/api/kotlinx-serialization-json.klib.api b/formats/json/api/kotlinx-serialization-json.klib.api index 42628403f1..27fe2f58f2 100644 --- a/formats/json/api/kotlinx-serialization-json.klib.api +++ b/formats/json/api/kotlinx-serialization-json.klib.api @@ -308,6 +308,7 @@ sealed class kotlinx.serialization.json/Json : kotlinx.serialization/StringForma final fun <#A1: kotlin/Any?> encodeToString(kotlinx.serialization/SerializationStrategy<#A1>, #A1): kotlin/String // kotlinx.serialization.json/Json.encodeToString|encodeToString(kotlinx.serialization.SerializationStrategy<0:0>;0:0){0§}[0] final fun parseToJsonElement(kotlin/String): kotlinx.serialization.json/JsonElement // kotlinx.serialization.json/Json.parseToJsonElement|parseToJsonElement(kotlin.String){}[0] final inline fun <#A1: reified kotlin/Any?> decodeFromString(kotlin/String): #A1 // kotlinx.serialization.json/Json.decodeFromString|decodeFromString(kotlin.String){0§}[0] + final inline fun <#A1: reified kotlin/Any?> encodeToString(#A1): kotlin/String // kotlinx.serialization.json/Json.encodeToString|encodeToString(0:0){0§}[0] final object Default : kotlinx.serialization.json/Json // kotlinx.serialization.json/Json.Default|null[0] } diff --git a/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt b/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt index a0fc7b1f8d..38058a1a77 100644 --- a/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt +++ b/formats/json/commonMain/src/kotlinx/serialization/json/Json.kt @@ -129,22 +129,6 @@ public sealed class Json( } } - /** - * Decodes and deserializes the given JSON [string] to the value of type [T] using deserializer - * retrieved from the reified type parameter. - * Example: - * ``` - * @Serializable - * data class Project(val name: String, val language: String) - * // Project(name=kotlinx.serialization, language=Kotlin) - * println(Json.decodeFromString("""{"name":"kotlinx.serialization","language":"Kotlin"}""")) - * ``` - * - * @throws SerializationException in case of any decoding-specific error - * @throws IllegalArgumentException if the decoded input is not a valid instance of [T] - */ - public inline fun decodeFromString(@FormatLanguage("json", "", "") string: String): T = - decodeFromString(serializersModule.serializer(), string) /** * Deserializes the given JSON [string] into a value of type [T] using the given [deserializer]. @@ -194,6 +178,48 @@ public sealed class Json( public fun parseToJsonElement(@FormatLanguage("json", "", "") string: String): JsonElement { return decodeFromString(JsonElementSerializer, string) } + + /** + * Following functions are copied from extensions on StringFormat + * to streamline experience for newcomers, since IDE does not star-import kotlinx.serialization.* automatically + */ + + /** + * Serializes the [value] of type [T] into an equivalent JSON using serializer + * retrieved from the reified type parameter. + * + * Example of usage: + * ``` + * @Serializable + * class Project(val name: String, val language: String) + * + * val data = Project("kotlinx.serialization", "Kotlin") + * + * // Prints {"name":"kotlinx.serialization","language":"Kotlin"} + * println(Json.encodeToString(data)) + * ``` + * + * @throws [SerializationException] if the given value cannot be serialized to JSON. + */ + public inline fun encodeToString(value: T): String = + encodeToString(serializersModule.serializer(), value) + + /** + * Decodes and deserializes the given JSON [string] to the value of type [T] using deserializer + * retrieved from the reified type parameter. + * Example: + * ``` + * @Serializable + * data class Project(val name: String, val language: String) + * // Project(name=kotlinx.serialization, language=Kotlin) + * println(Json.decodeFromString("""{"name":"kotlinx.serialization","language":"Kotlin"}""")) + * ``` + * + * @throws SerializationException in case of any decoding-specific error + * @throws IllegalArgumentException if the decoded input is not a valid instance of [T] + */ + public inline fun decodeFromString(@FormatLanguage("json", "", "") string: String): T = + decodeFromString(serializersModule.serializer(), string) } /**