Jackson中ArrayNode调用withArray报错,如何实现数组嵌套数组?
Jackson数组嵌套数组创建报错问题解答
错误是否符合预期?
是符合预期的。原因很明确:withArray()是ObjectNode的专属方法,作用是在对象节点中根据指定键名获取或创建对应的数组节点;但你的代码里,root是ArrayNode(数组节点),数组节点是按索引存储元素的结构,不存在键值对映射,根本无法调用withArray(),所以抛出这个异常完全合理,属于代码逻辑误用API导致的问题。
可行解决办法
结合你给出的示例JSON{"id": [1, 2, {"a": [4, 5]}]},分两种常见业务场景给出修复方案:
场景1:在数组中添加「包含子数组的对象元素」
如果currentElem(如"a[]")的含义是:往当前数组里新增一个对象,该对象的a字段为数组并添加目标value,代码可修改为:
if (root.getNodeType().equals(JsonNodeType.ARRAY)) { if (currentElem.endsWith("[]")) { String key = currentElem.substring(0, currentElem.length() - 2); // 先往数组中添加空对象节点 ObjectNode objNode = ((ArrayNode) root).addObject(); // 在对象节点内获取/创建目标数组,再添加value ArrayNode subArray = objNode.withArray(key); if (!subArray.has(value)) { subArray.add(value); } root = subArray; // 若后续需操作子数组,可更新root引用 } else { ((ObjectNode) ((ArrayNode) root).addObject()).put(currentElem, value); } }
场景2:在数组中直接嵌套数组
如果需求是直接在当前数组内添加子数组(比如生成[1, 2, [4,5]]这类结构),代码可修改为:
if (root.getNodeType().equals(JsonNodeType.ARRAY)) { if (currentElem.endsWith("[]")) { // 直接在当前数组下创建并添加子数组节点 ArrayNode subArray = ((ArrayNode) root).addArray(); subArray.add(value); root = subArray; } else { ((ObjectNode) ((ArrayNode) root).addObject()).put(currentElem, value); } }
核心注意点:ArrayNode的操作围绕索引和元素添加(如addObject()、addArray()、add(value)),而withArray()、put()这类键值相关方法是ObjectNode专属的,务必区分节点类型对应的API。
内容的提问来源于stack exchange,提问作者user19483562
相关产品推荐
相关产品推荐

