Spring Boot存储嵌套JSON数组到数据库,cover数组反序列化错误如何解决
Spring Boot嵌套JSON数组存储反序列化问题解决方案
错误根因
报错信息Cannot deserialize value of type com.demo.model.Cover from Array value (token JsonToken.START_ARRAY)的核心原因是实体类字段定义和JSON结构不匹配:你提交的JSON中coverinfo下的cover是数组结构,但com.demo.model.CoverInfo类中的cover字段被定义为了单个Cover对象,Jackson反序列化时无法将JSON数组转换为单个对象。
修复步骤
1. 修正实体类字段类型
修改CoverInfo类中的cover字段类型为集合或数组:
// 错误写法 private Cover cover; // 正确写法1:用List集合 private List<Cover> cover; // 正确写法2:用数组 private Cover[] cover;
2. 适配数据库存储逻辑
如果需要将该嵌套结构持久化到数据库,可根据业务需求选择以下两种方案:
- 方案1:JSON字段存储(适合不需要单独查询cover明细的场景)
数据库使用JSON类型存储整个数组,需给实体类字段加对应注解:// Hibernate 6以下需引入hibernate-types依赖 import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import org.hibernate.annotations.Type; import javax.persistence.Column; import java.util.List; public class CoverInfo { // 其他字段省略 @Type(type = "json") @Column(columnDefinition = "json") // MySQL 5.7+支持json类型,其他数据库对应调整 private List<Cover> cover; // getter、setter省略 } - 方案2:关联表存储(适合需要单独操作cover明细的场景)
将Cover定义为独立实体,和CoverInfo做一对多关联:import javax.persistence.OneToMany; import javax.persistence.CascadeType; import java.util.List; public class CoverInfo { // 其他字段省略 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "cover_info_id") private List<Cover> cover; // getter、setter省略 }
3. 功能验证
修改完成后重启项目,重新提交对应JSON即可完成正常的反序列化和存储操作。
内容的提问来源于stack exchange,提问作者Akoram
相关产品推荐
相关产品推荐

