将 JSON 数组反序列化为数据类或记录

Deserialize a JSON array to a data class or record

提问人:Jake 提问时间:11/9/2023 更新时间:11/12/2023 访问量:43

问:

给定此 JSON,

["answer", 42]

和伴随的课程,

data class JsonRow(val s: String, val n: Int)

如何使用 Jackson 将数组转换为类?


最小的可重现示例(这是在 Kotlin 中,但据我所知,Java 也存在同样的问题)

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue
import kotlin.test.Test
import kotlin.test.assertEquals


data class JsonRow(val s: String, val n: Int)

object Example {

    @Test
    fun example() {
        // Given
        val jsonArray = """["answer", 42]"""
        val objectMapper = jacksonObjectMapper()

        // When
        val actual = objectMapper.readValue<JsonRow>(jsonArray)

        // Then
        val expected = JsonRow("answer", 42)
        assertEquals(expected, actual)
    }
}

测试失败,并显示:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `com.example.JsonRow` from Array value (token `JsonToken.START_ARRAY`) at [Source: (String)"["answer", 42]"; line: 1, column: 1]

json kotlin jackson java-record

评论


答:

0赞 Jake 11/10/2023 #1

最简单的方法是使用 JsonFormat 注释将数据类的形状指定为 Array。

例如,添加此内容后,一切按预期工作

import com.fasterxml.jackson.annotation.JsonFormat

@JsonFormat(shape = JsonFormat.Shape.ARRAY)
data class JsonRow(val s: String, val n: Int)