JSONException: illegal identifier : \pos 1 异常报错问题
- 1.常见情况:
- 1.1 JSON 字符串格式不正确
- 1.2 JSON 字符串中包含了非法字符
- 1.3 解析 JSON 字符串的方式不正确
- 2.解决办法:
- 2.1 工具类
- 2.2 StringEscapeUtils.unescapeJava
- 3. JSONObject.parseObject(); 针对json异常
- 4. Jackson
- 5. 正则
- 6. str.replace
1.常见情况:
1.1 JSON 字符串格式不正确
如果在解析 JSON 字符串时发现其格式不正确,例如缺少逗号分隔符、括号不匹配等问题,就会导致 “illegal identifier” 错误。你可以检查代码确保 JSON 字符串的格式正确。
1.2 JSON 字符串中包含了非法字符
如果在 JSON 字符串中包含了非法字符,例如反斜杠未转义
、引号不成对等问题,就会导致 “illegal identifier” 错误。你可以使用 JSON 库提供的方法来将字符串转换为 JSON 对象或数组。
1.3 解析 JSON 字符串的方式不正确
如果在解析 JSON 字符串时使用了错误的方法或参数,就会导致 “illegal identifier” 错误。你可以检查代码并参考 JSON 库的文档来确定正确的解析方式和参数。
我这边的报错就是“/”未转义;
2.解决办法:
2.1 工具类
package com.example.去转移;
public class StringEscapeUtils {
public static String unescapeJava(String str) {
if (str == null) {
return null;
}
int sz = str.length();
StringBuilder out = new StringBuilder(sz);
StringBuilder unicode = new StringBuilder(4);
boolean hadSlash = false;
boolean inUnicode = false;
for (int i = 0; i < sz; i++) {
char ch = str.charAt(i);
if (inUnicode) {
unicode.append(ch);
if (unicode.length() == 4) {
try {
int value = Integer.parseInt(unicode.toString(), 16);
out.append((char) value);
unicode.setLength(0);
inUnicode = false;
hadSlash = false;
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe);
}
}
continue;
}
if (hadSlash) {
hadSlash = false;
switch (ch) {
case '\\':
out.append('\\');
break;
case '\'':
out.append('\'');
break;
case '\"':
out.append('"');
break;
case 'r':
out.append('\r');
break;
case 'f':
out.append('\f');
break;
case 't':
out.append('\t');
break;
case 'n':
out.append('\n');
break;
case 'b':
out.append('\b');
break;
case 'u':
inUnicode = true;
break;
default:
out.append(ch);
break;
}
continue;
} else if (ch == '\\') {
hadSlash = true;
continue;
}
out.append(ch);
}
if (hadSlash) {
out.append('\\');
}
return out.toString();
}
}
//调用方式
//调用方式
public static void main(String[] args) {
String str = "hello\\nworld";
// System.out.println("原数据"+str); //
String unescapedStr = StringEscapeUtils.unescapeJava(str);
System.out.println(unescapedStr); // 输出 hello\nworld 我这边直接换行了 因为\n 就是换行的意思
}
2.2 StringEscapeUtils.unescapeJava
仓库地址:https://mvnrepository.com/artifact/org.apache.commons/commons-text
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
public static void main(String[] args) {
String str = "hello\\nworld";
String unescapedStr = org.apache.commons.text.StringEscapeUtils.unescapeJava(str);
System.out.println(unescapedStr); // 输出 hello\nworld 我这边直接换行了 因为\n 就是换行的意思
}
3. JSONObject.parseObject(); 针对json异常
public static void main(String[] args) {
String str = "{\"id\":\"\", \"projectId\":115798429401088, \"sceName\": \"417471\"}";
JSONObject jsonObject=JSONObject.parseObject(str);
System.out.println(jsonObject);
}
4. Jackson
Jackson 库提供的 JsonNode 类来遍历 JSON 对象树,并对其中的字符串节点进行处理
注意jar的引用
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JsonUtils {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static <T> T fromJson(String json, Class<T> clazz) throws IOException {
return objectMapper.readValue(json, clazz);
}
public static String toJson(Object obj) throws JsonProcessingException {
return objectMapper.writeValueAsString(obj);
}
public static JsonNode unescapeJson(JsonNode node) {
if (node.isTextual()) {
ObjectNode parent = (ObjectNode) node.getParent();
parent.set(node.fieldName(), objectMapper.valueToTree(StringEscapeUtils.unescapeJava(node.asText())));
} else if (node.isArray()) {
node.forEach(JsonUtils::unescapeJson);
} else if (node.isObject()) {
node.fields().forEachRemaining(entry -> unescapeJson(entry.getValue()));
}
return node;
}
public static void main(String[] args) throws IOException {
String json = "{\"name\":\"hello\\nworld\",\"age\":18}";
JsonNode rootNode = objectMapper.readTree(json);
JsonNode unescapedNode = unescapeJson(rootNode);
String unescapedJson = toJson(unescapedNode);
System.out.println(unescapedJson); // 输出 {"name":"hello\nworld","age":18}
}
}
在这个示例中,我们先将 JSON 字符串解析成了一个 JsonNode 对象,并将其传递给了 unescapeJson 方法。该方法会递归遍历 JSON 对象树,对所有字符串节点调用 StringEscapeUtils.unescapeJava() 方法去除转义字符,并将结果设置回到父节点中。最后,我们再将修改后的 JsonNode 对象转换成了 JSON 字符串并输出。
5. 正则
通过把/替换成为其他的进行解决
String encodedPath = request.getRequestURI().replaceAll("/", "-");
6. str.replace
public static void main(String[] args) {
String str = "{\"id\":\"projectId\", \"sceName\": \"417471\"}";
str = str.replace("\\pos", ""); // 将 "\\pos" 替换为空字符串
JSONObject jsonObject=JSONObject.parseObject(str);
System.out.println(jsonObject);
}
str = str.replace("\\pos", ""); // 将 "\\pos" 替换为空字符串;
我这边写demo中此方法貌似无用大家可尝试下;
扩展:网上看到的未实践
采用hutool工具;
String string = StrUtil.strip(httpResponse.body(), "\"");
“\pos” 是一种 RTF(Rich Text Format)文档中的控制字符,表示当前位置为绝对位置(absolute position)。具体来说,在 RTF 文档中可以使用 “\pos” 控制符来指定文本或对象在页面上的绝对位置坐标。
然而,在 JSON 字符串中出现 “\pos” 通常是由于将 RTF 格式文本或富文本复制到了代码中,导致转换为 JSON字符串时包含了非法字符。JSON 标准中只允许使用特定的字符表示字符串、数值等数据类型,并且需要进行相应的转义处理。
因此,在将富文本复制到代码中时,应该先将其转换为普通文本,再作为字符串拷贝到代码中。或者使用专门的工具将 RTF 格式文本转换为 HTML或 Markdown 等格式,再进行相应的处理和转换。这样可以避免类似于 “\pos” 这样的问题。
大家也可以提前在网上找在线的去转义;大家其他的解决办法也可以留言 希望可以帮助大家解决问题