如何在Gson中实施强类型强制?

mefy6pfw  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(232)

我使用Gson来解析JSON。让我惊讶的是,如果我在POJO类中有一个类型为String的字段,并且在JSON中有一个number,它会正确解析而不会抛出异常。同样地,另一种方式-我写了这个测试来说明:

data class Parsed(
        val testString: String,
        val testNumber: Int,
    )

    @Test
    fun `test gson type parsing`() {
        val gson = Gson()

        val json = "{ \"testString\" : 1, \"testNumber\" : \"1\"}"

        val parsed = gson.fromJson(json, Parsed::class.java)

        assertThat(parsed.testString).isEqualTo("1") // passes
        assertThat(parsed.testNumber).isEqualTo(1) // passes
        // expected an exception because number is parsed into a string field and string is parsed into number
    }

有没有办法改变这种行为?(仅在GsonBuilder上找到setLenient(),但与此无关)

sauutmhj

sauutmhj1#

我不认为你可以在gson中转换类型强制。最好的办法可能是编写一个自定义的反序列化器来防止这种情况。
话虽如此,考虑在Kotlin代码中不使用gson,因为它完全规避了语言的空安全性。你最好使用一个Kotlin感知的序列化框架,比如Jackson(带有kotlin插件)或kotlinx-serialization。
另外,Jackson似乎允许关闭这种特定的类型强制转换,使用以下标志:https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/MapperFeature.html#ALLOW_COERCION_OF_SCALARS
Kotlinx-serialization似乎没有这样的选项:https://github.com/Kotlin/kotlinx.serialization/issues/1042

相关问题