kotlin JacksonJSON序列化,不使用来自一个字符串行的字段名

cyvaqqii  于 2022-12-13  发布在  Kotlin
关注(0)|答案(1)|浏览(99)

我有这个JSON要反序列化:

"data": {
  "type": 18,        
  "msg": "firstName,lastName,15" 
  "timestamp": 1551770400000 
}

我想在我的模型中得到这些数据:

class DataDto(
    type: String,
    timestamp: Long,
    msg: DataMsgDto?
) {
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    @JsonPropertyOrder("firstName", "lastName", "age")
    class DataMsgDto(
        firstName: String,
        lastName: String,
        age: Long
    )
}

我使用以下代码获取数据:

DataBuffer payload //this is what I get from server
val jsonNode = objectMapper.readTree(payload.toString(StandardCharsets.UTF_8))
objectMapper.treeToValue(jsonNode, DataDto::class.java)

但是这不起作用,因为在msg中我没有字段。那么,我该怎么做呢?

ppcbkaq5

ppcbkaq51#

您有一个包含逗号分隔值的JSON属性。JSON消息有效,并且可以由Jackson反序列化。
可以编写能够自动处理这种情况的自定义Jackson代码

但是解决这个问题最实际的方法不太可能是让Jackson理解msg,或者编写一个自定义的反序列化器。

class DataDto(
    val type: String,
    val timestamp: Long,
    // just use a normal String for msg
    val msg: String?
)

然后用Kotlin人工解码

fun parseDataDtoMsg(dto: DataDto): DataMsgDto? {
  val msgElements = dto.msg?.split(",") ?: return null

  // parse each message - you can chose whether to 
  // throw an exception if the `msg` does not match what you expect, 
  // or ignore invalid data and return `null`

  val firstName = ...
  val lastName = ...
  val age = ...

  return DataDtoMsg(
      firstName = firstName,
      lastName = lastName,
      age = age,
  )
}

data class DataMsgDto(
    val firstName: String
    val lastName: String
    val age: Long,
)

相关问题