NOTE: The answer from @IRus is also correct, it was being modified at the same time I wrote this to fill in more details.
应该使用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
包具有执行所有魔术功能的扩展函数.
另一个稍微不同的 Select 也很有效:
val genres = mapper.readValue<List<GenreDTO>>(json)
没有理由不使用Jackson的扩展功能和附加模块.它很小,并且解决了其他一些问题,这些问题需要您跳转来创建默认构造函数,或者使用一组注释.使用该模块,您的类可以是普通Kotlin(可选为data
类):
class GenreDTO(val id: Int, val name: String)