Skip to content

Commit 4228656

Browse files
authored
Iterate over element indicies in ObjectSerializer in order to let the format skip unknown keys (#1916)
Fixes #1915
1 parent 216ea9c commit 4228656

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

core/commonMain/src/kotlinx/serialization/internal/ObjectSerializer.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,14 @@ internal class ObjectSerializer<T : Any>(serialName: String, private val objectI
4040
}
4141

4242
override fun deserialize(decoder: Decoder): T {
43-
decoder.beginStructure(descriptor).endStructure(descriptor)
43+
decoder.decodeStructure(descriptor) {
44+
when (val index = decodeElementIndex(descriptor)) {
45+
CompositeDecoder.DECODE_DONE -> {
46+
return@decodeStructure
47+
}
48+
else -> throw SerializationException("Unexpected index $index")
49+
}
50+
}
4451
return objectInstance
4552
}
4653
}

formats/json/commonTest/src/kotlinx/serialization/features/ObjectSerialization.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
package kotlinx.serialization.features
66

77
import kotlinx.serialization.*
8-
import kotlinx.serialization.json.Json
9-
import kotlinx.serialization.json.JsonTestBase
8+
import kotlinx.serialization.json.*
109
import kotlinx.serialization.modules.*
11-
import kotlin.test.Test
10+
import kotlinx.serialization.test.*
11+
import kotlin.test.*
1212

1313
class ObjectSerializationTest : JsonTestBase() {
1414

@@ -46,4 +46,17 @@ class ObjectSerializationTest : JsonTestBase() {
4646
json
4747
)
4848
}
49+
50+
@Test
51+
fun testUnknownKeys() {
52+
val string = """{"metadata":"foo"}"""
53+
assertFailsWithMessage<SerializationException>("ignoreUnknownKeys") {
54+
Json.decodeFromString(
55+
ApiResponse.Error.serializer(),
56+
string
57+
)
58+
}
59+
val json = Json { ignoreUnknownKeys = true }
60+
assertEquals(ApiResponse.Error, json.decodeFromString(ApiResponse.Error.serializer(), string))
61+
}
4962
}

0 commit comments

Comments
 (0)