使用org.json删除指定JSON数组时误删整个JSON对象问题
问题原因
- 代码未执行任何删除逻辑:
getJSONArray("webAutomation")仅会读取对应数组的值,不会修改原JSON结构。 - 跨类库混用导致序列化异常:你用org.json库构建
JSONObject实例,却用Jackson的ObjectMapper做序列化。Jackson无法正确识别org.jsonJSONObject的内部数据存储结构,只会把对象自带的isEmpty()getter方法识别为empty属性序列化,最终输出{"empty":false}的异常结果。
解决方法
选择单一JSON类库完成全流程操作即可,不要跨库混用JSON对象:
方案1:全程使用org.json原生API
无需额外引入Jackson,直接用org.json自带的节点操作和序列化能力:
JSONObject jsonObject = new JSONObject(str); // 调用remove方法删除courses节点下的webAutomation键,这是实际生效的删除逻辑 jsonObject.getJSONObject("courses").remove("webAutomation"); System.out.println("after removal"); // 调用org.json自带的toString方法,传入数字参数可指定格式化缩进的空格数 String str2 = jsonObject.toString(2); System.out.println(str2);
运行后会保留除webAutomation数组外的所有原有JSON结构。
方案2:全程使用Jackson API
如果你本身依赖Jackson做JSON处理,就无需引入org.json,直接用Jackson的节点API操作:
ObjectMapper mapper = new ObjectMapper(); JsonNode root = mapper.readTree(str); // 拿到courses对应的ObjectNode后执行删除操作 ((ObjectNode) root.get("courses")).remove("webAutomation"); System.out.println("after removal"); // 序列化输出,可开启格式化打印 String str2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root); System.out.println(str2);
内容的提问来源于stack exchange,提问作者nikhil udgirkar
相关产品推荐
相关产品推荐

