Skip to content

Json.decodeFromString with data class serializers tolerates missing commas in encoded data #2287

Open
@gmkohler

Description

@gmkohler

Describe the bug

@Serializable serializers are successfully decoding JSON that is missing commas between its properties

To Reproduce

These tests will pass with multiple properties and multiple combinations of missing commas, so not a special case of N = 2.

import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import org.junit.jupiter.api.Test
import strikt.api.expectThat
import strikt.api.expectThrows
import strikt.assertions.contains
import strikt.assertions.isEqualTo
import strikt.assertions.isNotNull


class JsonTest {
    @Serializable
    data class Foo(
        val bar: String,
        val baz: Int,
    )

    val invalidEncoding = """{
        "bar": "buz"
        "baz": 1
    }""".trimIndent()

    @Test
    fun `decoding invalid JSON is tolerated by @Serializable serializers`() {
        val result = Json.decodeFromString(Foo.serializer(), invalidEncoding)

        expectThat(result) {
            get(Foo::bar) isEqualTo "buz"
            get(Foo::baz) isEqualTo 1
        }
    }

    @Test
    fun `decoding invalid JSON is not tolerated by JsonObject's serializer`() {
        expectThrows<SerializationException> {
            Json.decodeFromString(JsonObject.serializer(), invalidEncoding)
        }.and {
            get(SerializationException::message).isNotNull().contains("Unexpected JSON token")
        }
    }
}

Expected behavior

The decoding invalid JSON is tolerated by @Serializable serializers test should fail decoding the invalid JSON

Environment

  • Kotlin version: 1.8.20
  • Library version: 1.4.1
  • Kotlin platforms: JVM
  • Gradle version: 7.5
  • IDE version (if bug is related to the IDE) IntelliJ 2023.1 CE
  • Other relevant context JDK 17

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions