1 /* 2 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.serialization.json 6 7 import kotlinx.serialization.* 8 import kotlinx.serialization.builtins.* 9 import kotlinx.serialization.descriptors.* 10 import kotlinx.serialization.encoding.* 11 import kotlin.test.* 12 13 class MapLikeSerializerTest : JsonTestBase() { 14 15 @Serializable 16 data class StringPair(val a: String, val b: String) 17 18 object StringPairSerializer : KSerializer<StringPair> { 19 <lambda>null20 override val descriptor: SerialDescriptor = buildSerialDescriptor("package.StringPair", StructureKind.MAP) { 21 element<String>("a") 22 element<String>("b") 23 } 24 serializenull25 override fun serialize(encoder: Encoder, value: StringPair) { 26 val structuredEncoder = encoder.beginStructure(descriptor) 27 structuredEncoder.encodeSerializableElement(descriptor, 0, String.serializer(), value.a) 28 structuredEncoder.encodeSerializableElement(descriptor, 1, String.serializer(), value.b) 29 structuredEncoder.endStructure(descriptor) 30 } 31 deserializenull32 override fun deserialize(decoder: Decoder): StringPair { 33 val composite = decoder.beginStructure(descriptor) 34 if (composite.decodeSequentially()) { 35 val key = composite.decodeSerializableElement(descriptor, 0, String.serializer()) 36 val value = composite.decodeSerializableElement(descriptor, 1, String.serializer()) 37 return StringPair(key, value) 38 } 39 40 var key: String? = null 41 var value: String? = null 42 mainLoop@ while (true) { 43 when (val idx = composite.decodeElementIndex(descriptor)) { 44 CompositeDecoder.DECODE_DONE -> { 45 break@mainLoop 46 } 47 0 -> { 48 key = composite.decodeSerializableElement(descriptor, 0, String.serializer()) 49 } 50 1 -> { 51 value = composite.decodeSerializableElement(descriptor, 1, String.serializer()) 52 } 53 else -> throw SerializationException("Invalid index: $idx") 54 } 55 } 56 composite.endStructure(descriptor) 57 if (key == null) throw SerializationException("Element 'a' is missing") 58 if (value == null) throw SerializationException("Element 'b' is missing") 59 @Suppress("UNCHECKED_CAST") 60 return StringPair(key, value) 61 } 62 } 63 64 @Test testStringPairnull65 fun testStringPair() = assertJsonFormAndRestored(StringPairSerializer, StringPair("a", "b"), """{"a":"b"}""") 66 } 67