From 70c8d47fdfdb2c693e4266f73505f075b6e81e68 Mon Sep 17 00:00:00 2001 From: Vsevolod Tolstopyatov Date: Wed, 27 Apr 2022 13:11:06 +0300 Subject: [PATCH] Iterate over element indicies in ObjectSerializer in order to let the format skip unknown keys Fixes #1915 --- .../internal/ObjectSerializer.kt | 9 ++++++++- .../features/ObjectSerialization.kt | 19 ++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/core/commonMain/src/kotlinx/serialization/internal/ObjectSerializer.kt b/core/commonMain/src/kotlinx/serialization/internal/ObjectSerializer.kt index 450938aca..ebb9e2e43 100644 --- a/core/commonMain/src/kotlinx/serialization/internal/ObjectSerializer.kt +++ b/core/commonMain/src/kotlinx/serialization/internal/ObjectSerializer.kt @@ -40,7 +40,14 @@ internal class ObjectSerializer(serialName: String, private val objectI } override fun deserialize(decoder: Decoder): T { - decoder.beginStructure(descriptor).endStructure(descriptor) + decoder.decodeStructure(descriptor) { + when (val index = decodeElementIndex(descriptor)) { + CompositeDecoder.DECODE_DONE -> { + return@decodeStructure + } + else -> throw SerializationException("Unexpected index $index") + } + } return objectInstance } } diff --git a/formats/json/commonTest/src/kotlinx/serialization/features/ObjectSerialization.kt b/formats/json/commonTest/src/kotlinx/serialization/features/ObjectSerialization.kt index ad752e792..da5919c1f 100644 --- a/formats/json/commonTest/src/kotlinx/serialization/features/ObjectSerialization.kt +++ b/formats/json/commonTest/src/kotlinx/serialization/features/ObjectSerialization.kt @@ -5,10 +5,10 @@ package kotlinx.serialization.features import kotlinx.serialization.* -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonTestBase +import kotlinx.serialization.json.* import kotlinx.serialization.modules.* -import kotlin.test.Test +import kotlinx.serialization.test.* +import kotlin.test.* class ObjectSerializationTest : JsonTestBase() { @@ -46,4 +46,17 @@ class ObjectSerializationTest : JsonTestBase() { json ) } + + @Test + fun testUnknownKeys() { + val string = """{"metadata":"foo"}""" + assertFailsWithMessage("ignoreUnknownKeys") { + Json.decodeFromString( + ApiResponse.Error.serializer(), + string + ) + } + val json = Json { ignoreUnknownKeys = true } + assertEquals(ApiResponse.Error, json.decodeFromString(ApiResponse.Error.serializer(), string)) + } }