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
相关产品推荐
相关产品推荐

