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

Vert.x中RoutingContext无法接收JSON数组问题求助

解决Vert.x RoutingContext接收JSON数组的解码错误

我帮你分析下这个问题哈!你遇到的DecodeException本质是类型不匹配——Vert.x默认的JSON解析逻辑预期接收单个JSON对象,但你传的是JSON数组,所以它试图把数组转成LinkedHashMap(单个JSON对象的默认映射类型)时就报错了。

错误根源拆解

错误信息里的Cannot deserialize instance of java.util.LinkedHashMap out of START_ARRAY token已经说得很直白:

  • START_ARRAY是JSON数组的起始标记(也就是[)
  • 框架本来要解析成单个LinkedHashMap(对应JSON对象{}),结果收到了数组,自然解码失败

解决方案步骤

1. 用正确的方法接收JSON数组

别用getBodyAsJson()(这个是拿单个JSON对象的),改用getBodyAsJsonArray()来获取数组:

// 先确保已经配置了BodyHandler,否则拿不到请求体
router.route().handler(BodyHandler.create());

router.post("/accounts").handler(ctx -> {
    // 直接获取JSON数组
    JsonArray accountArray = ctx.getBodyAsJsonArray();
    
    // 遍历数组处理每个账户对象
    for (int i = 0; i < accountArray.size(); i++) {
        JsonObject accountObj = accountArray.getJsonObject(i);
        String name = accountObj.getString("name");
        int type = accountObj.getInteger("type");
        boolean active = accountObj.getBoolean("active");
        
        // 这里写你的业务逻辑,比如存数据库、参数校验等
        System.out.println("正在处理账户:" + name);
    }
    
    ctx.response().setStatusCode(200).end("JSON数组接收处理完成");
});

2. 转成自定义Java对象列表(如果需要)

如果你有自定义的Account实体类,可以把JsonArray直接转成对象列表:

// 假设Account类有name、type、active字段和对应的getter/setter
List<Account> accountList = accountArray.toList(new TypeReference<List<Account>>() {});

// 之后就可以直接操作对象了
for (Account account : accountList) {
    System.out.println("账户名称:" + account.getName());
}

3. 检查请求头配置

确保前端发送请求时,Content-Type设置为application/json,否则Vert.x的BodyHandler可能不会正确解析请求体。

这样调整后,就能正常接收你发送的JSON数组啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:26:31