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
相关产品推荐
相关产品推荐

