commons-text包中的StringEscapeUtils实现快捷高效的JSON转义字符串的反序列化

前言

一般我们在处理简单的JSON字符串时,直接通过JSON工具类即可完成了,列如:FastJson、Jackson、Gson等,但是遇到一般的转义字符,就需要我们进行纯手工的操作了,小的JSON字符串内容还不说,如果一旦遇到较长的转义的JSON字符串就不行了,这将成为系统性能方面的一个瓶颈,如果解决这个问题呢,答案就是:“ StringEscapeUtils ” 工具类咯。

 

StringEscapeUtils实现快捷高效的JSON转义字符串的反序列化

1、一般的JSON字符串序列化与反序列化

当调用接口接收到信息后,使用的是alibaba的FastJson工具类来进行反序列化的,示例代码如下:

    @Test
    public void fastjson() {
        // 将员工对象序列化为Json字符串
        String jsonString = JSON.toJSONString(initEmployee());
        System.out.println(jsonString);
        // 将Json字符串反序列化为Java对象
        Employee employee = JSON.parseObject(jsonString, Employee.class);
        System.out.println("empName: " + employee.getName());
    }

 

或者Jackson(相对于FastJson,FastJson在支持泛型方面更好些),示例代码如下:

    @Test
    public void jackson() throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        // 将Java对象序列化为Json字符串
        String asString = objectMapper.writeValueAsString(initEmployee());
        System.out.println(asString);
        // 将Json字符串反序列化为Java对象
        Employee employee = objectMapper.readValue(asString, Employee.class);
        System.out.println("empName: " + employee.getName());
    }

 

当然你也可以使用Google的Gson,示例代码如下:

    @Test
    public void gson() {
        Gson gson = new GsonBuilder().create();
        // 将Java对象序列化为Json字符串
        String json = gson.toJson(initEmployee());
        System.out.println(json);
        // 将Json字符串反序列化为Java对象
        Employee employee = gson.fromJson(json, Employee.class);
        System.out.println("empName: " + employee.getName());
    }

 

2、JSON转义字符串的反序列化

以上方法只能处理普通的/正确的JSON字符串,如果遇到一个转义的JSON字符串就不行了,如果在一个JSON字符串中存在很多的转义字符,那个这个将不是一个正确的JSON字符串,当然不能序列化成功了,示例内容如下:

"{\"id\":\"1001\",\"name\":\"张三\",\"password\":\"zhangsan\"}"

(当然以上只是为了证明问题的测试数据,实际数据接口数据要比这个复杂的多,而且进行了特殊的加密算法)

 

一般处理方法(纯手工操作):

通过手动剔除转义字符的方式,示例代码如下:

    @Test
    public void tData() {
        String data01 = "{\"id\":\"1001\",\"name\":\"张三\",\"password\":\"zhangsan\"}";
        System.out.println("data01:" + data01);
        // 序列化为JSON字符串
        String data02 = JSON.toJSONString(data01);
        System.out.println("data02:" + data02);
        //通过 replace 去掉斜杠
        String data03 = data02.replace("\\", "");
        System.out.println("data03:" + data03);
        //去掉首尾的引号
        String data04 = data03.substring(1, data03.length() - 1);
        System.out.println("data04:" + data04);
        Map map = JSON.parseObject(data04, Map.class);
        System.out.println(map.get("name"));
    }

得到了想要的结果如下:

但是上面这个有个问题,每一次的转换都会去遍历所有的内容,当内容长度小时无所谓,但是当长度较长时,问题就来了,会消耗大量的时间,例如,博主本人的数据量较大,没调用一次接口都会花费一到两分钟来处理结果,这个。。。

 

高级处理方法(通过StringEscapeUtils工具类实现):

通过Apache的commons-lang工具包中有很多字符串处理的工具类,StringEscapeUtils就是其中之一,不过需要注意的是StringEscapeUtils是2.3版本以上才加上的,不过博主在官网看到3.0以后又开始弃用了并将该功能搬移到了commons-text工具包中,所以需要注意导入对应的包才行呀!!!

如果使用commons-lang则添加依赖:


        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

如果使用commons-text则添加依赖:

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-text</artifactId>
			<version>1.6</version>
		</dependency>

使用StringEscapeUtils工具类进行反序列化转义字符,示例内容如下:

   @Test
    public void tData() {
        String data01 = "{\"id\":\"1001\",\"name\":\"张三\",\"password\":\"zhangsan\"}";
        System.out.println("data01:" + data01);
        // 序列化为JSON字符串
        String data02 = JSON.toJSONString(data01);
        System.out.println("data02:" + data02);
        // 通过StringEscapeUtils工具类反序列化转义字符
        String data04 = StringEscapeUtils.unescapeJava(data01);
        System.out.println("data04:" + data04);
        Map map = JSON.parseObject(data04, Map.class);
        System.out.println(map.get("name"));
    }

使用起来,结果一样,但是在处理大的较长的转义JSON字符串内容时,使用StringEscapeUtils的效果会更佳的显著咯!!!

当然StringEscapeUtils还有很多好玩而且非常实用的方法,这个就需要自己去玩了,如下图:

是不是很nice,有没有感觉已经到达了人生的巅峰!!!

 

 

 


 好了,关于 commons-text包中的StringEscapeUtils实现快捷高效的JSON转义字符串的反序列化 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:CSDN (Chinese Software Developer Network)
原        文:https://blog.csdn.net/Hello_World_QWP/article/details/91847880
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
org.apache.commons.text.StringEscapeUtils依赖于apache的commons-text包。具体导入的方式可以通过在项目的pom.xml文件中添加以下依赖项来实现: ``` <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> ``` 另外,可以通过导入以下语句来使用StringEscapeUtils类: ``` import org.apache.commons.text.StringEscapeUtils; ``` 在使用StringEscapeUtils类的时候,可以使用其中的不同方法来进行字符串转义操作。例如,可以使用`StringEscapeUtils.unescapeJava()`方法来将Java转义字符串还原为原始字符串。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [javaStringEscapeUtils.unescapeJava去掉转义字符](https://blog.csdn.net/a232884c/article/details/122365840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [java中反向转义org.apache.commons.lang3.StringEscapeUtils.unescapeJava](https://blog.csdn.net/weixin_39733943/article/details/114880799)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值