JSONException: illegal identifier : \pos 1 异常报错问题

简介: JSONException: illegal identifier : \pos 1 异常报错问题

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” 这样的问题。

大家也可以提前在网上找在线的去转义;大家其他的解决办法也可以留言 希望可以帮助大家解决问题


相关文章
|
JSON 数据格式
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
2785 0
|
域名解析 Kubernetes Java
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
6544 1
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
Web server failed to start. Port XXX was already in use.原因分析-解决方案
Web server failed to start. Port XXX was already in use.原因分析-解决方案
1666 1
Web server failed to start. Port XXX was already in use.原因分析-解决方案
|
存储 JSON fastjson
再也不用心惊胆战地使用FastJSON了——序列化篇
本篇将主要介绍json序列化的详细流程。本文阅读的FastJSON源码版本为2.0.31。
3911 49
|
Oracle Java 关系型数据库
@Id、@GeneratedValue的作用,以及@GeneratedValue的使用
@Id、@GeneratedValue的作用,以及@GeneratedValue的使用
|
设计模式 Java 容器
在Java中调用一个接口的多个实现类
在Java中调用一个接口的多个实现类
1537 4
|
Java Apache Spring
Java发送Http请求(HttpClient)
Java发送Http请求(HttpClient)
12588 2
java.sql.SQLException: sql injection violation
本文目录 1. 报错信息 2. 问题分析 3. 排除法 4. 解决方案
4096 0
|
存储 Java 数据库连接
MyBatis Plus中的批量插入:通过开启rewriteBatchedStatements=true
MyBatis Plus中的批量插入:通过开启rewriteBatchedStatements=true
1481 0
|
Java 应用服务中间件
完美解决tomcat启动异常:Invalid byte tag in constant pool: 19;Unable to process Jar entry [module-info.class]
完美解决tomcat启动异常:Invalid byte tag in constant pool: 19;Unable to process Jar entry [module-info.class]
2114 0