You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Kotlin嵌套数据类的Jackson反序列化异常问题?

问题原因

你遇到的问题核心是JSON结构与A类的字段类型不匹配:

  • A类的b字段是B类型,意味着JSON中对应"b"的位置应该是一个嵌套对象(比如{"b": {"b": 5}});
  • 但你当前的JSON里"b"直接是数值5,Jackson尝试把这个数值直接反序列化成B对象,而B默认只支持从带"b"字段的JSON对象结构反序列化,因此抛出异常;
  • 单独反序列化B时你用的JSON应该是{"b": 5}(符合B的结构),所以能正常运行。
解决方法

提供两种可行方案,根据你的需求选择:

方案1:调整JSON结构(推荐,符合标准序列化规范)

修改JSON为嵌套结构,让"b"对应B类型的对象:

{"b": {"b": 5}, "text": "blabla"}

无需修改代码,直接就能正常反序列化。

方案2:修改代码适配现有JSON结构

如果无法修改JSON,可以通过以下方式让代码适配当前JSON格式:

方式2.1:给B添加数值入参的构造函数

给B类添加一个接收Int的构造函数,并标记@JsonCreator,让Jackson可以用数值直接创建B实例:

data class B(
    @JsonProperty("b") val number: Int,
    @JsonProperty(access = JsonProperty.Access.READ_ONLY) val date: String = "",
) {
    @JsonCreator
    constructor(number: Int) : this(number, "")
}

方式2.2:给A添加适配构造函数

在A类中添加一个接收Int类型b参数的构造函数,内部自动转为B对象:

data class A(
    val b: B,
    val text: String
) {
    @JsonCreator
    constructor(
        @JsonProperty("b") number: Int,
        @JsonProperty("text") text: String
    ) : this(B(number), text)
}

内容的提问来源于stack exchange,提问作者CucumberAndCoroutines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:26:16