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
2589 0
|
存储 负载均衡 安全
分布式文件系统实战,使用MinIO构建分布式文件系统!
随着文件数据的越来越多,传统的文件存储方式通过tomcat或nginx虚拟化的静态资源文件在单一的服务器节点内已经无法满足系统需求,也不利于文件的管理和维护,这就需要一个系统来管理多台计算机节点上的文件数据,这就是分布式文件系统。
5999 0
分布式文件系统实战,使用MinIO构建分布式文件系统!
|
算法 Dubbo NoSQL
Java中5种List的去重方法及它们的效率对比,你用对了吗?
01、使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序) * * @param list * */ public static List removeDuplicationBy2For(List<Integer> list) { for (int i=0;i<list.size();i++) { for (int j=i+1;j<list.size();j++) { if(list.get(i).equa
25211 2
Java中5种List的去重方法及它们的效率对比,你用对了吗?
|
Java 数据库连接 mybatis
mybatis报错:The alias 'xxx' is already mapped to the value '*.*.xxx'
The alias 'xxx' is already mapped to the value '*.*.xxx'
18328 0
|
域名解析 Kubernetes Java
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
6228 1
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
|
11月前
|
存储 JSON fastjson
再也不用心惊胆战地使用FastJSON了——序列化篇
本篇将主要介绍json序列化的详细流程。本文阅读的FastJSON源码版本为2.0.31。
3498 49
|
Java
Java通过HttpClient从外部url下载文件到本地
该Java程序旨在通过URL将外部网络文件(如图片)下载至本地,并解决防盗链问题。首先,它通过`HttpGet`请求获取远程文件,并通过设置`Referer`头防止防盗链。然后,根据响应内容类型确定文件后缀并保存至指定路径。测试表明,程序能够成功下载文件。
1373 8
Java通过HttpClient从外部url下载文件到本地
|
Java Maven
idea Maven Helper插件使用方法
idea Maven Helper插件使用方法
1803 0
idea Maven Helper插件使用方法
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
java.sql.SQLException: sql injection violation
本文目录 1. 报错信息 2. 问题分析 3. 排除法 4. 解决方案
3964 0