如何解决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
相关产品推荐
相关产品推荐

