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

news2024/11/20 9:10:49

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/568797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑客入门教程从零基础入门到精通,看完这一篇就够了

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决…

Revit建模|怎么创建轴网标高?

大家好&#xff0c;这里是建模助手&#xff0c;今天给大家讲一讲怎么创建轴网标高。 标高用来定义楼层层高以及生成平面视图&#xff0c;轴网用于为构件定位&#xff0c;在Revit中轴网确定了一个不可见的工作平面&#xff0c;轴网编号以及标高符号样式均可定制修改。目前&…

每日练题---C语言

目录 前言&#xff1a; 一.求最小公倍数 1.1公式法 1.2遍历法 1.3乘除法 二.倒置字符串 前言&#xff1a; 今日份题目有&#xff1a;求两个整数的最小公倍数&#xff0c;求倒置字符串&#xff0c;。 一.求最小公倍数 牛客网链接&#xff1a;OJ链接 百度词条&#xff1a;…

Python自动化测试框架怎么搭建?完整框架源码给到你

目录 前言 搭建过程&#xff1a; 一阶段&#xff0c; 二阶段&#xff0c; 三阶段&#xff0c; 四阶段 下面具体的说一下搭建过程 一阶段&#xff1a; 二阶段&#xff1a; 三阶段&#xff1a; 四阶段 前言 背景&#xff1a;公司需要每一个项目组都搭建自己的一套自动…

Vue企业级项目开发思路,附带源码

项目的技术栈展示 以及项目的核心重点部分 项目搭建使用element实现首页布局 顶部导航菜单及与左侧导航联动的面包屑实现 封装一个ECharts组件 封装一个Form表单组件和Table表格组件 企业开发之权限管理思路讲解 项目搭建使用element实现首页布局 顶部导航菜单及与左侧导…

技术分享 | OB 慢查询排查思路

本文汇总了项目实践中前辈的经验和笔者的理解&#xff0c;旨在帮助初学 OceanBase&#xff08;以下简称 OB&#xff09;的工程师&#xff0c;快速解决 SQL 执行缓慢等性能问题。当遇到性能问题时&#xff0c;很多工程师可能会感到无从下手&#xff0c;本文将根据关键日志提供多…

14_Uboot图形化配置

目录 U-Boot图形化配置体验 make menuconfig过程分析 Kconfig语法简介 Mainmenu menu/endmenu条目 config条目 depends on和select choice/endchoice Menuconfig Comment Source 添加自定义菜单 U-Boot图形化配置体验 uboot或Linux内核可以通过输入"make menu…

计算机组成原理-存储系统-外部存储虚拟存储器

目录 一、外部存储 1.1磁盘组成 1.2性能指标 1.3磁盘地址 1.4硬盘的工作原理 1.5磁盘阵列 二、 固态硬盘SSD 三、虚拟存储器(存储系统详细知识点) 3.1 页式存储器 逻辑地址-》主存(物理)地址 加入块表(TLB)的转换过程 3.2 段式存储器 3.3 段页式存储器 一、外部存储 又称…

一个非系统工程师所关心的——Android开机流程

一、Loader层 1. Boot ROM: 上电后&#xff0c;BootRom会被激活&#xff0c;引导芯片代码开始从预定义的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0c;然后加载引导程序到RAM。 2. Boot Loader引导程序 Android是基于Linux系统的&#xff0c;它没有BIO…

路由器端口映射-原理+图解

文章目录 1. 前言2. 内部服务器3. 内网IP3.1 含义3.2 查询内网IP方法3.3 直观法判断内网IP 4. 内部端口5. 外部端口6. 远程桌面连接7. 端口映射原理图8. 欢迎纠正~ 1. 前言 端口映射就是可将N台主机的内网IP地址映射成一个公网IP地址&#xff0c;从而让外网可以访问到局域网内…

Linux 学习笔记(九):基于 TSS 的进程切换

一、TSS 基本概念 1、什么是 TSS &#xff1f; TSS&#xff08;Task State Segment&#xff09;即任务状态段。具体的说&#xff0c;在设计 “Intel 架构”&#xff08;即 x86 系统结构&#xff09;时&#xff0c;每个任务&#xff08;进程or线程&#xff09;都对应有一个独立…

Java经典笔试题—day13

Java经典笔试题—day13 &#x1f50e;选择题&#x1f50e;编程题&#x1f36d;参数解析&#x1f36d;跳石板 &#x1f50e;结尾 &#x1f50e;选择题 (1)一个关系数据库文件中的各条记录 &#xff08;&#xff09; A. 前后顺序不能任意颠倒&#xff0c;一定要按照输入的顺序排…

测试4-数据库设计

测试4-数据库设计 目录 测试4-数据库设计选择题简答题1. 画E-R图并将其转换为适当的关系模型题目E-R图关系模型 2. 画E-R图并将其转换为关系模型题目E-R图关系模型 选择题 下列关于数据库运行和维护的叙述中&#xff0c;正确的是D。 A &#xff0e;只要数据库正式投入运行&…

网狐大联盟服务端源码分析之服务核心-ServiceCore-Base64编解码实现

工程属性分析: 1.工程属性->动态链接库 2.dll类型->MFC共享DLL 3.字符集->Unicode 4.库导出类型->使用模块定义文件def 5.生成的导出模块函数与对应的地址定义lib文件 源码分析: 头文件分析: 头文件与对应含义表示如下:

shell变量类型含义 长方形面积计算 截取相应字段方法

1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; 1&#xff09;截取网站访问的协议 …

spring之spring入门程序

1.创建Maven Module 2.pom.xml引入依赖 此图引用于https://www.cnblogs.com/Zz-maker/p/11199331.html Maven种的依赖的传递性&#xff0c;spring-context依赖于core,beans,aop,expression等模块&#xff0c;但是在pom.xml中只引用spring-context即可&#xff1a; <?xml v…

WhatsApp与电子商务,最佳拍档

您可以通过将 WhatsApp 整合到您的电子商务业务策略中。首先&#xff0c;您可以从将WhatsApp集成到您的客服渠道&#xff0c;与您的其他客户沟通渠道形成交互&#xff0c;并统一进行客户管理与回复&#xff0c;您需要一个工具做到——SaleSmartly&#xff08;ss客服&#xff09…

UI自动化测试、接口测试等自动化测试详解

今天跟大家介绍UI测试、接口测试、单元测试主要内容&#xff0c;以及每种测试花费时间讨论。 一.UI测试【Selenium】 UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为&#xff0c;即模拟用户在软件界面上的各种操作&#xff0c;并验证这些操…

030:Mapbox GL设置渐变矢量矩形

第030个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据,构成渐变的矩形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共109行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:…

第十三章 常用类(包装类和 String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据类型的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 publi…