gpt4 book ai didi

json - Kotlin - 如何在 jackson Json 反序列化期间防止 null 进入 Map 对象?

转载 作者:行者123 更新时间:2023-12-02 12:48:16 24 4
gpt4 key购买 nike

首先让我通过一些可运行的代码来帮助您解决我想要解决的问题:

(如果要运行此示例代码,则要包含 Maven 依赖项)

<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.9.4.1</version>
</dependency>

只需创建一个 Kotlin 文件并通过以下可运行代码:
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

data class MapObject(val map: Map<String, String>, val age: Int)
data class SimpleObject(val name:String, val age: Int)
data class MapSimpleObject(val map: SimpleObject, val age: Int)

fun main(args: Array<String>) {
val mapper = jacksonObjectMapper()

val mObj: MapObject = mapper.readValue("""{"map": {"name": null}, "age": 1}""")
println(mObj) // mObj can be created, print "MapObject(map={name=null}, age=1)", which is not nice

val msObj: MapSimpleObject = mapper.readValue("""{"map": {"name": null, "age": 1}, "age": 1}""")
println(msObj) // throw MissingKotlinParameterException at line above, which is nice

val sObj: SimpleObject = mapper.readValue("""{"name": null, "age": 1}""")
println(sObj) // throw MissingKotlinParameterException at line above, which is nice

// val m: Map<String, Int> = mapOf(null to 2) // won't compile, which is nice
}

如您所见,专门针对 val mObj: MapObject , 甚至 MapObjectmap是在 Kotlin 中定义的具有非 Null 类型的 Map,仍然可以使用 Json 有效负载创建对象,例如 {"map": {"name": null}, "age": 1} , 结果 mObj对象为 MapObject(map={name=null}, age=1)
这不是我想要的,我希望 Kotlin 的 null 安全功能能够捕捉到这一点,如果我像这样放置 json 有效负载,我会抛出一些异常。

那么如何确定 null如果我有像 data class MapObject(val map: Map<String, String>, val age: Int) 这样的数据类结构,则不会注入(inject)?

最佳答案

IIUC,Kotlin 的空安全性主要是编译时。没有什么可以阻止null在运行时通过反射设置为不可为空的属性,如 Kotlin reference状态:

...The only possible causes of NPE's may be:

Java interoperation: ... Generic types used for Java interoperation with incorrect nullability, e.g. a piece of Java code might add null into a Kotlin MutableList, meaning that MutableList should be used for working with it;

关于json - Kotlin - 如何在 jackson Json 反序列化期间防止 null 进入 Map 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50643864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com