Skip to content

Commit

Permalink
Iterate over element indicies in ObjectSerializer in order to let the…
Browse files Browse the repository at this point in the history
… format skip unknown keys (#1916)

Fixes #1915
  • Loading branch information
qwwdfsad committed Apr 27, 2022
1 parent 216ea9c commit 4228656
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
Expand Up @@ -40,7 +40,14 @@ internal class ObjectSerializer<T : Any>(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
}
}
Expand Up @@ -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() {

Expand Down Expand Up @@ -46,4 +46,17 @@ class ObjectSerializationTest : JsonTestBase() {
json
)
}

@Test
fun testUnknownKeys() {
val string = """{"metadata":"foo"}"""
assertFailsWithMessage<SerializationException>("ignoreUnknownKeys") {
Json.decodeFromString(
ApiResponse.Error.serializer(),
string
)
}
val json = Json { ignoreUnknownKeys = true }
assertEquals(ApiResponse.Error, json.decodeFromString(ApiResponse.Error.serializer(), string))
}
}

0 comments on commit 4228656

Please sign in to comment.