在 JSON 解析中,特殊字符指的是需要进行转义处理的字符,例如双引号 (`"`), 反斜杠 (`\`), 斜杠 (`/`), 换行符 (`\n`), 回车 (`\r`), 制表符 (`\t`) 等。这些字符在 JSON 中有特殊的意义,因此需要正确处理以确保 JSON 解析的正确性和安全性。
JSON解析工具类
public class JsonStringUtil {
/**
* 将字符串中的特殊字符转义
*
* @param jsonString 原始字符串
* @return 转义后的字符串
*/
public static String escapeJson(String jsonString) {
if (jsonString == null) {
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < jsonString.length(); i++) {
char c = jsonString.charAt(i);
switch (c) {
// 对于存储的json结构体来说,"全部处理不适用,单个String可适用
// case '\"':
// sb.append("\\\"");
// break;
case '\\':
sb.append("\\\\");
break;
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
/**
* 将字符串中的转义字符还原
*
* @param jsonString 转义后的字符串
* @return 还原后的字符串
*/
public static String unescapeJson(String jsonString) {
if (jsonString == null) {
return null;
}
StringBuilder sb = new StringBuilder();
boolean isEscape = false;
for (int i = 0; i < jsonString.length(); i++) {
char c = jsonString.charAt(i);
if (isEscape) {
switch (c) {
case '\"':
case '\\':
case '/':
case 'b':
case 'f':
case 'n':
case 'r':
case 't':
sb.append(unescapeChar(c));
break;
default:
sb.append(c);
}
isEscape = false;
} else {
if (c == '\\') {
isEscape = true;
} else {
sb.append(c);
}
}
}
return sb.toString();
}
private static char unescapeChar(char c) {
switch (c) {
case '\"':
return '\"';
case '\\':
return '\\';
case '/':
return '/';
case 'b':
return '\b';
case 'f':
return '\f';
case 'n':
return '\n';
case 'r':
return '\r';
case 't':
return '\t';
default:
return c;
}
}
}