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

Spring JSON反序列化报错:Map类型无法从数组值反序列化

问题分析与解决方案

核心问题

你遇到的第二个反序列化错误,根源是请求体中dimensions字段的JSON格式与Product实体类的类型不匹配:

  • 实体类里dimensions定义为Map<String, Double>,对应JSON应该是一个键值对对象
  • 但你的请求体里dimensions写成了数组包裹对象的格式,Jackson无法将数组反序列化为Map

另外还有两个次要问题:

  1. 请求体中pricePerUnit是字符串类型(带引号),但实体类是float,虽然Jackson能自动转换,但建议统一为数字格式
  2. 服务层批量插入用循环save效率较低,推荐用saveAll

具体修复步骤

1. 修正Postman请求体格式

把dimensions的数组格式改成直接的键值对对象,同时去掉pricePerUnit的引号:

{
   "products": [
        {
            "productCode": "P100",
            "name": "produit 1",
            "pricePerUnit": 250.99,
            "dimensions": {
                "productHeight": 55,
                "productWeight": 20
            }
        },
        {
            "productCode": "P101",
            "name": "produit 2",
            "pricePerUnit": 250.99,
            "dimensions": {
                "productHeight": 60,
                "productWeight": 15
            }
        }
    ]
}

2. 优化服务层批量插入逻辑

将循环单个save改为批量saveAll,提升性能:

public class ProductServiceImpl implements ProductService {
    
    private final ProductRepository productRepository;

    public ProductServiceImpl(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    @Override
    public void addProducts(List<Product> products) {
        productRepository.saveAll(products);
    }
}

3. 验证实体类注解(可选)

确保@Type(type="jsonb")和JsonBinaryType配置正确,保证Map能正确序列化为PostgreSQL的jsonb类型,这部分你当前的代码是没问题的,但如果后续仍有存储问题,可以检查依赖是否引入了hibernate-types-52(或对应版本)。

为什么第一个错误会解决?

最初的错误是因为你直接用ArrayList<Product>接收请求体,但请求体是一个包含products字段的对象,而不是纯数组。创建ProductWrapper类后,请求体的结构与接收类匹配,所以这个问题自然解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:45:39