如果在解析 JSON 字符串时发现其格式不正确,例如缺少逗号分隔符、括号不匹配等问题,就会导致 “illegal identifier” 错误。你可以检查代码确保 JSON 字符串的格式正确。
如果在 JSON 字符串中包含了非法字符,例如反斜杠未转义
、引号不成对等问题,就会导致 “illegal identifier” 错误。你可以使用 JSON 库提供的方法来将字符串转换为 JSON 对象或数组。
如果在解析 JSON 字符串时使用了错误的方法或参数,就会导致 “illegal identifier” 错误。你可以检查代码并参考 JSON 库的文档来确定正确的解析方式和参数。
我这边的报错就是“/”未转义;
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 就是换行的意思
}
仓库地址: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 就是换行的意思
}
public static void main(String[] args) {
String str = "{\"id\":\"\", \"projectId\":115798429401088, \"sceName\": \"417471\"}";
JSONObject jsonObject=JSONObject.parseObject(str);
System.out.println(jsonObject);
}
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 字符串并输出。
通过把/替换成为其他的进行解决
String encodedPath = request.getRequestURI().replaceAll("/", "-");
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” 这样的问题。
大家也可以提前在网上找在线的去转义;大家其他的解决办法也可以留言 希望可以帮助大家解决问题