反序列化以下JSON的正确语法是什么:

[ {
  "id" : "1",
  "name" : "Blues"
}, {
  "id" : "0",
  "name" : "Rock"
} ]

I tried:

//Works OK
val dtos  = mapper.readValue(json, List::class.java)

However I want:

val dtos : List<GenreDTO>  = mapper.readValue(json, 
    List<GenreDTO>::class.java)

以上语法不正确,给出:only classes are allowed on the left hand side of a class literal

推荐答案

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)

Json相关问答推荐

基于两个条件替换扁平化的SON中的值

我如何知道TJSONNumber是double还是double?

将部分数据字节解组到自定义 struct 中

基于 JSON 字段的 Jolt 条件标志

在 VS Code 中将一个正则表达式替换为另一个正则表达式

使用 Power BI 中的 Deneb 视觉效果绘制面积图中的 X 轴日期

如何使用jolt将嵌套数据变成线性数据

jq json - 按键名 Select

如何使用 Google 表格应用程序脚本将 JSON 中的多个字段提取到 Google 表格中

从 PowerShell 编辑 Windows 终端配置文件设置 JSON

在 Flutter 中将对象转换为可编码对象失败

Angular 2/Web Api - json 解析错误语法错误意外结束输入

JSON Schema 与 XML Schema 的比较及其future

jQuery.getJSON 和 jQuery.parseJSON 返回 [object Object]?

如何在 Django JSONField 数据上聚合(最小/最大等)?

我可以使用空字符串作为对象标识符吗?

Gson 将一组数据对象转换为 json - Android

运算符不存在:json = json

使用 C# 调用 json

如何在本地存储中存储对象数组?