Kotlin multiplatform JSON serialization library with type-safe, reflectionless approach supporting all platforms
npx @tessl/cli install tessl/maven-org-jetbrains-kotlinx--kotlinx-serialization-json@1.9.0Kotlinx Serialization JSON is a multiplatform JSON serialization library for Kotlin providing a type-safe, reflectionless approach to JSON handling. It supports all Kotlin platforms (JVM, JS, Native, WebAssembly) with zero runtime reflection and compile-time code generation.
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
}import kotlinx.serialization.json.*
import kotlinx.serialization.*import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class User(val name: String, val age: Int)
// Create JSON instance with configuration
val json = Json {
prettyPrint = true
ignoreUnknownKeys = true
}
// Serialize to JSON string
val user = User("Alice", 25)
val jsonString = json.encodeToString(user)
// {"name":"Alice","age":25}
// Deserialize from JSON string
val userFromJson = json.decodeFromString<User>(jsonString)
// Work with JsonElement hierarchy
val element = json.encodeToJsonElement(user)
val userBack = json.decodeFromJsonElement<User>(element)
// Parse string to JsonElement
val jsonElement = json.parseToJsonElement("""{"name":"Bob","age":30}""")Kotlinx Serialization JSON is built around several key components:
Main serialization and deserialization functionality for converting between Kotlin objects and JSON strings or JsonElement representations.
sealed class Json(
val configuration: JsonConfiguration,
override val serializersModule: SerializersModule
) : StringFormat {
companion object Default : Json
fun <T> encodeToString(serializer: SerializationStrategy<T>, value: T): String
inline fun <reified T> encodeToString(value: T): String
fun <T> decodeFromString(deserializer: DeserializationStrategy<T>, string: String): T
inline fun <reified T> decodeFromString(string: String): T
fun <T> encodeToJsonElement(serializer: SerializationStrategy<T>, value: T): JsonElement
inline fun <reified T> encodeToJsonElement(value: T): JsonElement
fun <T> decodeFromJsonElement(deserializer: DeserializationStrategy<T>, element: JsonElement): T
inline fun <reified T> decodeFromJsonElement(json: JsonElement): T
fun parseToJsonElement(string: String): JsonElement
}
fun Json(from: Json = Json.Default, builderAction: JsonBuilder.() -> Unit): JsonAbstract representation of JSON data structures providing a DOM-like API for working with JSON without specific types.
sealed class JsonElement
sealed class JsonPrimitive : JsonElement() {
abstract val isString: Boolean
abstract val content: String
}
class JsonObject(private val content: Map<String, JsonElement>) : JsonElement(), Map<String, JsonElement>
class JsonArray(private val content: List<JsonElement>) : JsonElement(), List<JsonElement>
object JsonNull : JsonPrimitive()
// Factory functions
fun JsonPrimitive(value: Boolean?): JsonPrimitive
fun JsonPrimitive(value: Number?): JsonPrimitive
fun JsonPrimitive(value: String?): JsonPrimitive
fun JsonUnquotedLiteral(value: String?): JsonPrimitiveComprehensive configuration system for customizing JSON encoding and decoding behavior through builder pattern.
class JsonBuilder {
var encodeDefaults: Boolean
var ignoreUnknownKeys: Boolean
var isLenient: Boolean
var prettyPrint: Boolean
var explicitNulls: Boolean
var coerceInputValues: Boolean
var allowSpecialFloatingPointValues: Boolean
var allowStructuredMapKeys: Boolean
var useArrayPolymorphism: Boolean
var classDiscriminator: String
var namingStrategy: JsonNamingStrategy?
var serializersModule: SerializersModule
}
class JsonConfiguration(/* all configuration properties */)Fluent DSL for constructing JsonObject and JsonArray instances programmatically with type-safe operations.
inline fun buildJsonObject(builderAction: JsonObjectBuilder.() -> Unit): JsonObject
inline fun buildJsonArray(builderAction: JsonArrayBuilder.() -> Unit): JsonArray
class JsonObjectBuilder {
fun put(key: String, element: JsonElement): JsonElement?
fun put(key: String, value: Boolean?): JsonElement?
fun put(key: String, value: Number?): JsonElement?
fun put(key: String, value: String?): JsonElement?
fun putJsonObject(key: String, builderAction: JsonObjectBuilder.() -> Unit): JsonElement?
fun putJsonArray(key: String, builderAction: JsonArrayBuilder.() -> Unit): JsonElement?
}
class JsonArrayBuilder {
fun add(element: JsonElement): Boolean
fun add(value: Boolean?): Boolean
fun add(value: Number?): Boolean
fun add(value: String?): Boolean
fun addJsonObject(builderAction: JsonObjectBuilder.() -> Unit): Boolean
fun addJsonArray(builderAction: JsonArrayBuilder.() -> Unit): Boolean
}Interfaces and base classes for implementing custom JSON serialization logic with access to JsonElement representations.
interface JsonEncoder : Encoder, CompositeEncoder {
val json: Json
fun encodeJsonElement(element: JsonElement)
}
interface JsonDecoder : Decoder, CompositeDecoder {
val json: Json
fun decodeJsonElement(): JsonElement
}
abstract class JsonTransformingSerializer<T>(
private val tSerializer: KSerializer<T>
) : KSerializer<T> {
protected open fun transformDeserialize(element: JsonElement): JsonElement
protected open fun transformSerialize(element: JsonElement): JsonElement
}
abstract class JsonContentPolymorphicSerializer<T>(
private val baseClass: KClass<T>
) : KSerializer<T> {
protected abstract fun selectDeserializer(element: JsonElement): DeserializationStrategy<T>
}Annotations for controlling JSON serialization behavior including alternative property names and polymorphic serialization.
@Target(AnnotationTarget.PROPERTY)
annotation class JsonNames(vararg val names: String)
@Target(AnnotationTarget.CLASS)
annotation class JsonClassDiscriminator(val discriminator: String)
@Target(AnnotationTarget.CLASS)
annotation class JsonIgnoreUnknownKeysBuilt-in naming strategies for transforming property names during serialization/deserialization.
fun interface JsonNamingStrategy {
fun serialNameForJson(descriptor: SerialDescriptor, elementIndex: Int, serialName: String): String
companion object Builtins {
val SnakeCase: JsonNamingStrategy
val KebabCase: JsonNamingStrategy
}
}Platform-specific extensions providing additional functionality for JVM streams and JavaScript dynamic objects.
// JVM only
fun <T> Json.encodeToStream(serializer: SerializationStrategy<T>, value: T, stream: OutputStream)
fun <T> Json.decodeFromStream(deserializer: DeserializationStrategy<T>, stream: InputStream): T
fun <T> Json.decodeToSequence(stream: InputStream, deserializer: DeserializationStrategy<T>, format: DecodeSequenceMode): Sequence<T>
// JavaScript only
fun <T> Json.decodeFromDynamic(deserializer: DeserializationStrategy<T>, dynamic: dynamic): T
fun <T> Json.encodeToDynamic(serializer: SerializationStrategy<T>, value: T): dynamicenum class DecodeSequenceMode {
/** Parse JSON objects/arrays separated by whitespace (newlines, spaces, tabs) */
WHITESPACE_SEPARATED,
/** Parse a JSON array containing objects/values as elements */
ARRAY_WRAPPED,
/** Automatically detect format based on first non-whitespace character */
AUTO_DETECT
}
enum class ClassDiscriminatorMode {
NONE,
ALL_JSON_OBJECTS,
POLYMORPHIC
}