xref: /aosp_15_r20/external/kotlinx.serialization/guide/example/example-json-28.kt (revision 57b5a4a64c534cf7f27ac9427ceab07f3d8ed3d8)
1*57b5a4a6SAndroid Build Coastguard Worker // This file was automatically generated from json.md by Knit tool. Do not edit.
2*57b5a4a6SAndroid Build Coastguard Worker package example.exampleJson28
3*57b5a4a6SAndroid Build Coastguard Worker 
4*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.*
5*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.json.*
6*57b5a4a6SAndroid Build Coastguard Worker 
7*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.descriptors.*
8*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.encoding.*
9*57b5a4a6SAndroid Build Coastguard Worker 
10*57b5a4a6SAndroid Build Coastguard Worker data class UnknownProject(val name: String, val details: JsonObject)
11*57b5a4a6SAndroid Build Coastguard Worker 
12*57b5a4a6SAndroid Build Coastguard Worker object UnknownProjectSerializer : KSerializer<UnknownProject> {
<lambda>null13*57b5a4a6SAndroid Build Coastguard Worker     override val descriptor: SerialDescriptor = buildClassSerialDescriptor("UnknownProject") {
14*57b5a4a6SAndroid Build Coastguard Worker         element<String>("name")
15*57b5a4a6SAndroid Build Coastguard Worker         element<JsonElement>("details")
16*57b5a4a6SAndroid Build Coastguard Worker     }
17*57b5a4a6SAndroid Build Coastguard Worker 
deserializenull18*57b5a4a6SAndroid Build Coastguard Worker     override fun deserialize(decoder: Decoder): UnknownProject {
19*57b5a4a6SAndroid Build Coastguard Worker         // Cast to JSON-specific interface
20*57b5a4a6SAndroid Build Coastguard Worker         val jsonInput = decoder as? JsonDecoder ?: error("Can be deserialized only by JSON")
21*57b5a4a6SAndroid Build Coastguard Worker         // Read the whole content as JSON
22*57b5a4a6SAndroid Build Coastguard Worker         val json = jsonInput.decodeJsonElement().jsonObject
23*57b5a4a6SAndroid Build Coastguard Worker         // Extract and remove name property
24*57b5a4a6SAndroid Build Coastguard Worker         val name = json.getValue("name").jsonPrimitive.content
25*57b5a4a6SAndroid Build Coastguard Worker         val details = json.toMutableMap()
26*57b5a4a6SAndroid Build Coastguard Worker         details.remove("name")
27*57b5a4a6SAndroid Build Coastguard Worker         return UnknownProject(name, JsonObject(details))
28*57b5a4a6SAndroid Build Coastguard Worker     }
29*57b5a4a6SAndroid Build Coastguard Worker 
serializenull30*57b5a4a6SAndroid Build Coastguard Worker     override fun serialize(encoder: Encoder, value: UnknownProject) {
31*57b5a4a6SAndroid Build Coastguard Worker         error("Serialization is not supported")
32*57b5a4a6SAndroid Build Coastguard Worker     }
33*57b5a4a6SAndroid Build Coastguard Worker }
34*57b5a4a6SAndroid Build Coastguard Worker 
mainnull35*57b5a4a6SAndroid Build Coastguard Worker fun main() {
36*57b5a4a6SAndroid Build Coastguard Worker     println(Json.decodeFromString(UnknownProjectSerializer, """{"type":"unknown","name":"example","maintainer":"Unknown","license":"Apache 2.0"}"""))
37*57b5a4a6SAndroid Build Coastguard Worker }
38