注意: @IRus 的回答也是正确的,在我写这篇文章的同时正在修改它以填写更多细节。 em>
您应该使用Jackson + Kotlin module,否则当您没有默认构造函数时,您将在反序列化为 Kotlin 对象时遇到其他问题。
您的第一个代码示例:
val dtos = mapper.readValue(json, List::class.java)
返回推断类型 List<*>,因为您没有指定更多类型信息,它实际上是 List<Map<String,Any>>,它并不是真正“工作正常”,但不会产生任何错误。它是不安全的,没有输入。
第二个代码应该是:
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
val mapper = jacksonObjectMapper()
// ...
val genres: List<GenreDTO> = mapper.readValue(json)
作业右侧不需要任何其他内容,Jackson 的 Kotlin 模块将具体化泛型并在内部为 Jackson 创建 TypeReference。请注意 readValue 导入,您需要它或 .* 以使 com.fasterxml.jackson.module.kotlin 包具有执行所有魔术的扩展功能。
一个稍微不同的替代方案也有效:
val genres = mapper.readValue<List<GenreDTO>>(json)
没有理由不使用 Jackson 的扩展功能和附加模块。它很小,并且解决了其他需要您跳过箍来创建默认构造函数或使用一堆注释的问题。有了这个模块,你的类就可以是普通的 Kotlin(可选为 data 类):
class GenreDTO(val id: Int, val name: String)