diff options
Diffstat (limited to 'guide/example/example-json-28.kt')
-rw-r--r-- | guide/example/example-json-28.kt | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/guide/example/example-json-28.kt b/guide/example/example-json-28.kt new file mode 100644 index 00000000..a3fab617 --- /dev/null +++ b/guide/example/example-json-28.kt @@ -0,0 +1,37 @@ +// This file was automatically generated from json.md by Knit tool. Do not edit. +package example.exampleJson28 + +import kotlinx.serialization.* +import kotlinx.serialization.json.* + +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* + +data class UnknownProject(val name: String, val details: JsonObject) + +object UnknownProjectSerializer : KSerializer<UnknownProject> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("UnknownProject") { + element<String>("name") + element<JsonElement>("details") + } + + override fun deserialize(decoder: Decoder): UnknownProject { + // Cast to JSON-specific interface + val jsonInput = decoder as? JsonDecoder ?: error("Can be deserialized only by JSON") + // Read the whole content as JSON + val json = jsonInput.decodeJsonElement().jsonObject + // Extract and remove name property + val name = json.getValue("name").jsonPrimitive.content + val details = json.toMutableMap() + details.remove("name") + return UnknownProject(name, JsonObject(details)) + } + + override fun serialize(encoder: Encoder, value: UnknownProject) { + error("Serialization is not supported") + } +} + +fun main() { + println(Json.decodeFromString(UnknownProjectSerializer, """{"type":"unknown","name":"example","maintainer":"Unknown","license":"Apache 2.0"}""")) +} |