如何正确截取字符串中_json后JSON片段 避免索引越界异常
问题根因
- 结束索引取值错误:
indexOf('}')返回的是整个字符串第一个}的位置,对应"name":{}的闭合括号,位置远早于"_json"出现的位置,substring方法传入的起始索引大于结束索引,直接触发下标越界异常。 - 起始索引偏移错误:仅给
indexOf("_json") + 1的偏移量不符合需求,你要提取的是"_json":之后的对象内容,偏移量需要覆盖整个"_json":整段字符,同时_json对应的对象内部存在大量嵌套{}、数组结构,直接找第一个}完全匹配不到对应的闭合括号。
推荐解决方案
方案1:JSON解析(最稳定)
源字符串去掉前缀===Username===>>后是标准JSON结构,用JSON解析库提取字段是最稳妥的方案,不会受JSON内部结构变化影响。示例代码以Jackson为例:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; // 移除前缀得到完整JSON字符串 String pureJson = username.replaceFirst("^===Username===>>", ""); ObjectMapper objectMapper = new ObjectMapper(); JsonNode root = objectMapper.readTree(pureJson); // 直接提取目标_json字段 JsonNode targetJson = root.get("profile").get("_json"); // 转成字符串输出 String result = targetJson.toString();
如果使用Fastjson,代码更简洁:
import com.alibaba.fastjson.JSONObject; String pureJson = username.replaceFirst("^===Username===>>", ""); JSONObject root = JSONObject.parseObject(pureJson); JSONObject targetJson = root.getJSONObject("profile").getJSONObject("_json"); String result = targetJson.toJSONString();
方案2:字符串截取(仅作为备选,不推荐生产环境使用)
如果确实无法引入JSON解析库,可以通过括号计数的方式匹配对应闭合括号:
// 查找"_json:"的起始位置 int keyIndex = username.indexOf("\"_json\":"); if (keyIndex == -1) { throw new RuntimeException("未找到_json字段"); } // 找到_json对应的对象起始{位置 int objStart = username.indexOf("{", keyIndex); if (objStart == -1) { throw new RuntimeException("_json字段无对应对象结构"); } // 括号计数匹配闭合位置 int bracketCount = 1; int objEnd = objStart + 1; while (bracketCount > 0 && objEnd < username.length()) { char c = username.charAt(objEnd); if (c == '{') { bracketCount++; } else if (c == '}') { bracketCount--; } objEnd++; } if (bracketCount != 0) { throw new RuntimeException("JSON结构不完整,未找到对应闭合括号"); } // 截取包含外层{}的_json对象 String result = username.substring(objStart, objEnd);
内容的提问来源于stack exchange,提问作者sromit
相关产品推荐
相关产品推荐

