我使用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()
,但与此无关)
1条答案
按热度按时间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