Kotlin multiplatform JSON serialization library with JavaScript-specific dynamic object conversion capabilities
npx @tessl/cli install tessl/maven-org-jetbrains-kotlinx--kotlinx-serialization-json-js@1.9.0Kotlinx Serialization JSON for JavaScript is the JavaScript platform implementation of Kotlin's multiplatform JSON serialization library. It provides comprehensive JSON serialization and deserialization capabilities with JavaScript-specific features for seamless interoperability with native JavaScript objects.
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-js:1.9.0")import kotlinx.serialization.json.*
import kotlinx.serialization.*For JavaScript-specific dynamic conversion:
import kotlinx.serialization.json.Json
// Dynamic functions are extension functions on JsonFor JSON annotations and builders:
import kotlinx.serialization.json.JsonNames
import kotlinx.serialization.json.JsonClassDiscriminator
import kotlinx.serialization.json.JsonIgnoreUnknownKeys
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.buildJsonArrayFor JsonElement tree manipulation:
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.JsonNull
// Extension properties for type conversion
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive@Serializable
data class User(val name: String, val age: Int, val isActive: Boolean)
// Create Json instance
val json = Json {
ignoreUnknownKeys = true
prettyPrint = true
}
// Serialize to JSON string
val user = User("Alice", 25, true)
val jsonString = json.encodeToString(user)
// {"name":"Alice","age":25,"isActive":true}
// Deserialize from JSON string
val parsedUser = json.decodeFromString<User>(jsonString)
// JavaScript-specific: Convert to/from dynamic objects
val dynamicObject = json.encodeToDynamic(user)
val userFromDynamic = json.decodeFromDynamic<User>(dynamicObject)Kotlinx Serialization JSON is built around several key components:
Primary JSON serialization and deserialization functionality with comprehensive configuration options.
object Json {
companion object {
val Default: Json
}
}
fun Json(builderAction: JsonBuilder.() -> Unit = {}): Json
fun Json(from: Json, builderAction: JsonBuilder.() -> Unit): Json
// String serialization
fun <T> Json.encodeToString(serializer: SerializationStrategy<T>, value: T): String
inline fun <reified T> Json.encodeToString(value: T): String
fun <T> Json.decodeFromString(deserializer: DeserializationStrategy<T>, string: String): T
inline fun <reified T> Json.decodeFromString(string: String): T
// JsonElement serialization
fun <T> Json.encodeToJsonElement(serializer: SerializationStrategy<T>, value: T): JsonElement
inline fun <reified T> Json.encodeToJsonElement(value: T): JsonElement
fun <T> Json.decodeFromJsonElement(deserializer: DeserializationStrategy<T>, element: JsonElement): T
inline fun <reified T> Json.decodeFromJsonElement(element: JsonElement): T
fun Json.parseToJsonElement(string: String): JsonElementJavaScript-specific functionality for converting between Kotlin objects and native JavaScript objects with full type safety.
@ExperimentalSerializationApi
fun <T> Json.encodeToDynamic(serializer: SerializationStrategy<T>, value: T): dynamic
@ExperimentalSerializationApi
inline fun <reified T> Json.encodeToDynamic(value: T): dynamic
@ExperimentalSerializationApi
fun <T> Json.decodeFromDynamic(deserializer: DeserializationStrategy<T>, dynamic: dynamic): T
@ExperimentalSerializationApi
inline fun <reified T> Json.decodeFromDynamic(dynamic: dynamic): TProgrammatic JSON tree manipulation with a rich hierarchy of JsonElement types for building and accessing JSON structures.
sealed class JsonElement
abstract class JsonPrimitive : JsonElement {
abstract val content: String
val isString: Boolean
val contentOrNull: String?
}
class JsonObject(val content: Map<String, JsonElement>) : JsonElement, Map<String, JsonElement>
class JsonArray(val content: List<JsonElement>) : JsonElement, List<JsonElement>
object JsonNull : JsonPrimitive()
fun JsonPrimitive(value: Boolean?): JsonPrimitive
fun JsonPrimitive(value: Number?): JsonPrimitive
fun JsonPrimitive(value: String?): JsonPrimitiveFluent DSL for constructing JSON objects and arrays with type-safe builder functions.
fun buildJsonObject(builderAction: JsonObjectBuilder.() -> Unit): JsonObject
fun buildJsonArray(builderAction: JsonArrayBuilder.() -> Unit): JsonArray
interface JsonObjectBuilder {
fun put(key: String, value: JsonElement)
fun put(key: String, value: String?)
fun put(key: String, value: Number?)
fun put(key: String, value: Boolean?)
fun putJsonObject(key: String, builderAction: JsonObjectBuilder.() -> Unit)
fun putJsonArray(key: String, builderAction: JsonArrayBuilder.() -> Unit)
}Comprehensive configuration system for customizing JSON encoding/decoding behavior, naming strategies, and polymorphism handling.
class JsonBuilder {
var encodeDefaults: Boolean
var explicitNulls: Boolean
var ignoreUnknownKeys: Boolean
var coerceInputValues: Boolean
var prettyPrint: Boolean
var prettyPrintIndent: String
var isLenient: Boolean
var allowSpecialFloatingPointValues: Boolean
var allowStructuredMapKeys: Boolean
var allowTrailingComma: Boolean
var allowComments: Boolean
var useAlternativeNames: Boolean
var namingStrategy: JsonNamingStrategy?
var decodeEnumsCaseInsensitive: Boolean
var classDiscriminator: String
var classDiscriminatorMode: ClassDiscriminatorMode
var useArrayPolymorphism: Boolean
}
interface JsonNamingStrategy {
fun serialNameForJson(descriptor: SerialDescriptor, elementIndex: Int, serialName: String): String
companion object {
val SnakeCase: JsonNamingStrategy
val KebabCase: JsonNamingStrategy
}
}Configuration and Customization
Base classes and interfaces for implementing custom JSON serialization logic with transformation and polymorphic capabilities.
abstract class JsonTransformingSerializer<T>(private val tSerializer: KSerializer<T>) : KSerializer<T> {
protected open fun transformSerialize(element: JsonElement): JsonElement = element
protected open fun transformDeserialize(element: JsonElement): JsonElement = element
}
abstract class JsonContentPolymorphicSerializer<T : Any>(private val baseClass: KClass<T>) : AbstractPolymorphicSerializer<T>() {
protected abstract fun selectDeserializer(element: JsonElement): DeserializationStrategy<T>
}
interface JsonEncoder : Encoder, CompositeEncoder {
val json: Json
fun encodeJsonElement(element: JsonElement)
}
interface JsonDecoder : Decoder, CompositeDecoder {
val json: Json
fun decodeJsonElement(): JsonElement
}JSON-specific annotations for controlling serialization behavior, providing alternative names, class discriminators, and selective ignoring of unknown properties.
/**
* Allows multiple alternative names for a single property during JSON deserialization
*/
@ExperimentalSerializationApi
annotation class JsonNames(vararg val names: String)
/**
* Specifies a custom key for class discriminator values in polymorphic serialization
*/
@ExperimentalSerializationApi
annotation class JsonClassDiscriminator(val discriminator: String)
/**
* Allows specific classes to ignore unknown properties during deserialization
*/
@ExperimentalSerializationApi
annotation class JsonIgnoreUnknownKeysenum class ClassDiscriminatorMode {
NONE, POLYMORPHIC, ALL_JSON_OBJECTS
}
class JsonEncodingException(message: String) : SerializationException(message)
class JsonDecodingException(message: String) : SerializationException(message)