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

JSON数组反序列化失败:如何转为ArrayList并映射到自定义类

解决JSON数组反序列化为ArrayList的问题

错误原因

你传入的JSON是数组格式(外层包裹[]),但代码里直接尝试将其反序列化为单个MocktailDto对象,JSON-B无法完成数组到单个对象的转换,因此抛出「Can't deserialize JSON array into class」错误。

解决方案

利用JSON-B的TypeToken来指定泛型集合类型,直接将JSON数组反序列化为ArrayList<MocktailDto>,代码修改如下:

@POST
public Response createMocktail(String m){
    // 通过TypeToken获取ArrayList<MocktailDto>的泛型类型
    Type mocktailListType = new TypeToken<ArrayList<MocktailDto>>() {}.getType();
    // 反序列化为ArrayList
    ArrayList<MocktailDto> mocktailList = jsonb.fromJson(m, mocktailListType);
    
    // 从列表中取出目标对象(你的JSON数组中只有一个元素)
    MocktailDto mocktail = mocktailList.get(0);
    return Response.ok(mocktailManager.createMocktail(mocktail)).build();
}

关于JSONObject的问题

你尝试的JSONObject jsonObj = new JSONObject(m)无效,是因为当前项目中没有引入对应JSON库(如org.json)的依赖。既然已经在使用JSON-B(javax.json.bind.Jsonb),建议统一用JSON-B的API处理,避免引入额外依赖。

额外建议

如果你的接口设计上是接收单个Mocktail数据,可要求前端修改JSON格式为单个对象(外层用{}包裹,去掉数组的[]),这样就能直接用原代码反序列化为单个MocktailDto对象,无需处理数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:31:08