修复REST API返回的无效JSON并替换字段内引号的解决方案咨询
修复REST API返回的无效JSON并替换字段内引号的解决方案咨询
嘿,我之前也碰到过这种API返回半吊子JSON的糟心事!直接用解析库报错,全局替换又容易误伤其他字段,给你几个针对性的解决思路,都是实际踩坑后验证过的:
一、精准正则替换(快速解决,适合结构固定的场景)
既然问题只出在Name字段的取值里,我们可以写个只瞄准该字段内部双引号的正则,完全不会碰其他字段(比如你提到的空值Address)。
看你用到了String.replaceAll(),应该是Java环境吧?给你个代码示例:
String invalidJson = "{\"results\" : { \"Name\" : \"xxxx, \"yyyy\"\", \"Role\" : \"developer\", \"Address\" : \"\" }}"; // 仅替换Name字段值内部的双引号为单引号 String fixedJson = invalidJson.replaceAll("(?<=\"Name\" : \".*)\"(?=.*?(?=\"(,|})))", "'"); // 现在fixedJson就是标准有效JSON了,能正常用解析库处理
这个正则的逻辑很清晰:
(?<=\"Name\" : \".*)是反向预查,确保我们要替换的双引号在Name字段的取值范围内(?=.*?(?=\"(,|})))是正向预查,保证这个双引号是字段内部的内容,不是字段结束的闭合引号- 只把这些精准匹配到的双引号换成单引号,其他字段的内容完全不受影响
二、逐字符遍历处理(更稳妥,适合复杂边界场景)
如果API返回的JSON偶尔还有其他小问题,或者你担心正则有漏网的边界情况,可以手动遍历字符串,标记是否进入了Name字段的取值区域,只在这个区域内替换引号:
String invalidJson = "{\"results\" : { \"Name\" : \"xxxx, \"yyyy\"\", \"Role\" : \"developer\", \"Address\" : \"\" }}"; StringBuilder sb = new StringBuilder(); boolean isInNameValue = false; boolean isInQuotes = false; for (char c : invalidJson.toCharArray()) { // 仅在Name字段的取值引号内,把双引号替换成单引号 if (isInNameValue && isInQuotes && c == '"') { sb.append('\''); continue; } sb.append(c); // 检测是否进入Name字段的取值起始位置 if (sb.length() >= 10 && sb.substring(sb.length() - 10).equals("\"Name\" : \"")) { isInNameValue = true; isInQuotes = true; } // 检测是否离开Name字段的取值区域 if (isInNameValue && c == '"') { int prevIndex = sb.length() - 2; if (prevIndex >= 0 && (sb.charAt(prevIndex) == ',' || sb.charAt(prevIndex) == '}')) { isInNameValue = false; isInQuotes = false; } } } String fixedJson = sb.toString(); // 现在可以放心用Jackson、Gson这类库解析这个JSON了
最后给个小提醒
上面的方法都是客户端的临时补救方案,最靠谱的还是联系API开发者修复输出的JSON——规范的JSON应该把内部引号转义成\",从源头解决问题才是长久之计。
内容来源于stack exchange
相关产品推荐
相关产品推荐

