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

如何正确截取字符串中_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:06:01