java json escape_关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)...
一、需求
现有一个字符串str
String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";
String params = "{\"sJson\":\"{\\\"operationtype\\\":1,\\\"content\\\":{\\\"senderid\\\":438,\\\"sendername\\\":\\\"许峰\\\",\\\"receiverid\\\":\\\"220\\\",\\\"receivername\\\":\\\"邓强 \\\",\\\"mtitle\\\":\\\"test\\\",\\\"mcontent\\\":\\\"test\\\",\\\"attlist\\\":[]}}\"}";
System.out.println("str = " + str);
System.out.println("params = " + params);
在控制台的输出为:
str = {\"name\":\"spy\",\"id\":\"123456\"}
params ={"sJson":"{\"operationtype\":\"1\",\"content\":{\"senderid\":\"438\",\"sendername\":\"许峰\",\"receiverid\":\"220\",\"receivername\":\"邓强\",\"mtitle\":\"test\",\"mcontent\":\"test\",\"attlist\":[]}}"}
目标:1、将str转化为标准的json格式串str1,以调用JsonUtil的方法,将字符串转为map。即目标str1为:
str1 = {"name":"spy","id":"123456"}
2、将params转化为标准的json格式串params,以调用JsonUtil的方法,将字符串转为map。即目标str1为:
{"sJson":"{\"operationtype\":\"1\",\"content\":{\"senderid\":\"438\",\"sendername\":\"许峰\",\"receiverid\":\"220\",\"receivername\":\"邓强\",\"mtitle\":\"test\",\"mcontent\":\"test\",\"attlist\":[]}}"}
二、实现方法
错误实现方法:
param = param.replaceAll("\\\\",",");
param = param.replaceAll(",,,",",");
param = param.replaceAll(",,",",");
param = param.replaceAll(",","\\\\");
因为一直没办法将\\\替换成功,在replaceAll中\\\\表示一个反斜杆 \\\\\\还是一个反斜杠,所以这种转译是失败的,我找到一个java内置工具包,可以实现自动转译,如下:
1. 使用 StringEscapeUtils中的转义与反转义
apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils。利用它可方便地进行html、xml、java等的转义与反转义。
String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";
System.out.println("原始 str = " + str);
String str1 = StringEscapeUtils.unescapeJava(str);
System.out.println("目标 str1 = " + str1);
//对应方法的StringEscapeUtils.escapeJava(str1); //可将str1转义回str
控制台输出:
原始 str = {\"name\":\"spy\",\"id\":\"123456\"}
目标 str1 = {"name":"spy","id":"123456"}
2. 使用Java的replaceAll方法
String str1 = str.replaceAll("\\\\","");
//控制台str1的输出为:{"name":"spy","id":"123456"}
三、Java 的replaceAll 内涵解析
使用Java的replaceAll(String regex, String replacement)函数,即用replacement替换所有的regex匹配项,regex是一个正则表达式,replacement是字符串。
String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\":\\\"123456\\\"}";
(1)对于串str,Java将其进行转义,\\ 表示 \ ,\” 表示 ” ,故而在Java内存中即为:
{\”name\”:\”spy\”,\”id\”:\”123456\”},然而,我们的目标是 {“name”:”spy”,”id”:”123456”},即将转义字符 \ 替换为空。
(2)Java的replaceAll(String regex, String replacement)函数,第一个参数是一个正则表达式。在正则表达式中的“\”与后面紧跟的那个字符构成一个转义字符,代表着特殊的意义,比如”\n”表示换行符等。所以,如果要在正则表达式中表示一个反斜杠\,则应当用\\表达 。但参数regex 首先会经过Java的一次转义,若想表达两个反斜杠 \\,则需四个反斜杠。
综上所述:replaceAll 的第一个参数是正则表达式,故而要经过两次转义,一次Java、一次正则。因此就需要四个反斜杠才可以匹配一个反斜杠。故而,替换一个反斜杠为空的replaceAll的代码即为:
str1 = str.replaceAll("\\\\","");
四、补充说明
String的replaceAll 同Matcher.replaceAll. 如下是String的repalceAll的源码实现。
public String repalceAll(String expr,String substitute){
return Pattern.compile(expr).matcher(this).replaceAll(substitute);
}
大家可以注意到Pattern.compile(expr)的参数是正则表达式。故而:
错误写法(运行报错):
String tmp = Pattern.compile("\\").matcher("h\\").replaceAll("ello");
正确写法:
String tmp = Pattern.compile("\\\\").matcher("h\\").replaceAll("ello"); //输出为hello
java json escape_关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)...相关推荐
- java.sql.SQLException: ORA-01436: 用户数据中的 CONNECT BY 循环
SELECT r1.region_id,parent_id FROM cnl_region r1 WHERE r1.region_id =1 START WITH r1.region_id = 1 C ...
- java数组-如何在一堆数据中使用数组!
数组 1.类型一致的一组数据,其实相当于集合概念. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来 ...
- 右斜杠 java chr_PHP(5.3+)中的\(反斜杠)有什么作用?
命名空间 在PHP 5.3+中,反斜杠\符号用于名称空间.它是指示命名空间的起始符号,也用作子命名空间名称之间的分隔符. 请参阅有关 Opcache 此外,在PHP 7.0以上版本的一些功能被替换操作 ...
- PTA Java版 有重复的数据
有重复的数据(java) 在一大堆数据中找出重复的是一件经常要做的事情.现在,我们要处理许多整数,在这些整数中,可能存在重复的数据. 你要写一个程序来做这件事情,读入数据,检查是否有重复的数据.如果有 ...
- 从vue文件中抽取出子组件的流程及过程中踩过的坑
流程: 1. 确保注册.引入子组件的正确性: 创建一个新的vue文件,包含基本的template,及export的内容,其中可简单包含空的data函数.暂时先不把子组件中的代码移出.在父组件中impo ...
- java对象转json字符串日期格式_fastJSON字符串类型数据中的日期转换为Java bean的日期对象...
fastJSON字符串类型数据中的日期转换为Java bean的日期对象 Person.java import java.io.Serializable; import java.util.Date; ...
- json数据解析与JAVA对象转换以及在JQUERY中的使用
JSON基础了解 JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小 ...
- java 获取json的值_Java如何获取JSON数据中的值
场景:在接口自动化场景中,下个接口发送的请求参数,依赖上个接口请求结果中的值.需要将获取值作为全局参数引用. import java.io.File; import java.io.FileInput ...
- Java如何获取JSON数据中的值 备忘
Java如何获取JSON数据中的值 取出JsonArray中的object(orderNo) 嵌套 JsonObeject { JsonObeject { JsonArray [Ob ...
最新文章
- java 同步方式 lock_Java的同步锁(Lock)
- Vue进行格式化时间Y-m-d h:m:s
- php如何缩小图片,PHP图片缩小函数一例
- 7-1 多数组排序 (12 分)三种做法(冒泡排序 ; 重写sort方法 ;利用sort和栈)
- 安卓开发面试题及答案,一次哔哩哔哩面试经历,年薪50W
- 【原型设计】第三节:Axure RP9 母版的使用说明以及操作教程
- dll放在unity哪个文件夹下_unity调用C#dll文件
- imu 里程计融合_多传感器融合 RLINS概述
- 超赞!终于有网友用Java实现了第三方qq账号登录...
- [安全攻防进阶篇] 三.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏
- 想知道“照片识别文字”的技巧吗?快看这几个方法
- 攻城狮还是产品运营?
- 怎么批量在文件名前面加上数字序号,对文件进行编号排序?
- Django——08.with语句,url标签, 解析特殊字符查verbatim
- 论“黄海和渤海开凿人工运河的分析”(最新)
- js动态函数(方法)
- C语言十进制转八进制
- 微信缴纳罚款无法连接服务器,为什么我的违章罚款在微信上交不了?原因竟是…...
- 《THE BASIC GRAMMER OF C》
- java毕业设计物流企业健康管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
热门文章
- php masonry,jQuery Masonry瀑布流布局详解
- sgi集群管理软件SMC安装步骤整理
- atmega16单片机c语言程序设计经典实例pdf,Atmega16单片机实用程序.pdf
- 【Python数据分析】波士顿房价分析小例子
- Qt warning Pass a context object as connect 3th paramter
- 微信小程序体验(1):携程酒店机票火车票
- 2022新的Echarts Demo 网址
- 群辉中使用私有Docker Registry
- 迅雷联合创始人程浩首次反思:我们为何错失三大机遇?
- 权力的游戏第八季在线观看