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

Java字符串转JSON报错:p_val_error_text特殊字符处理求助

解决Java字符串转JSON时的解析报错问题

问题根源

你遇到的JSONException根本原因不是值里的冒号,而是p_val_error_text的字段值test name : is owner没有用双引号包裹。JSON语法明确要求:所有字符串类型的字段值必须用双引号括起来,数值类型(比如20、0)不需要,但字符串值必须加。


方案1:直接修正原始字符串(最稳妥)

如果这个字符串是你自己构造的,直接给p_val_error_text的值加上双引号就能解决问题,完全不需要替换冒号——JSON允许字符串内部包含冒号,只要值被双引号包裹就合法:

String val="[{\"p_emp\":20,\"p_val_error\":0,\"p_val_error_text\":\"test name : is owner\"}]";
JSONArray jsonArray = new JSONArray(val);

方案2:处理外部传入的不规范字符串

如果字符串是外部接口返回或其他不可控来源的,没法直接修改构造逻辑,就用正则表达式针对性处理p_val_error_text的字段值:

步骤1:先修复JSON格式(给值加双引号)

用正则匹配"p_val_error_text":后面的内容,自动给它包裹双引号:

String val = "[{\"p_emp\":20,\"p_val_error\":0,\"p_val_error_text\":test name : is owner}]";
// 正则匹配p_val_error_text后的内容,添加双引号
String correctedVal = val.replaceAll("(\"p_val_error_text\":)([^}]+)", "$1\"$2\"");
JSONArray jsonArray = new JSONArray(correctedVal);

步骤2:同时替换值中的特殊字符(按需)

如果需要额外清理值里的特殊字符(比如你提供的正则示例里的那些),可以在添加引号前先处理值:

String val = "[{\"p_emp\":20,\"p_val_error\":0,\"p_val_error_text\":test name : is owner}]";
Pattern pattern = Pattern.compile("(\"p_val_error_text\":)([^}]+)");
Matcher matcher = pattern.matcher(val);
StringBuffer sb = new StringBuffer();

while (matcher.find()) {
    String originalValue = matcher.group(2);
    // 替换特殊字符:这里保留了空格和冒号,如果你不需要可以从正则里去掉
    String cleanedValue = originalValue.replaceAll("[&/\\\\#,+()$~%!.„'\"*‚^_¤?<>|@ª{«»§}©®™]", "").trim();
    matcher.appendReplacement(sb, matcher.group(1) + "\"" + cleanedValue + "\"");
}
matcher.appendTail(sb);

String correctedVal = sb.toString();
JSONArray jsonArray = new JSONArray(correctedVal);

内容的提问来源于stack exchange,提问作者franco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:43:15