关于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
关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)的更多相关文章
- 处理Json数据中的日期类型.如/Date(1415169703000)/格式
在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...
- C#调用接口返回json数据中含有双引号 或其他非法字符的解决办法
这几天,调用别人接口返回json数据含有特殊符号(双引号),当转换成json对象总是报错, json字符格式如下 { "BOXINFO":[ { ", "ITE ...
- 从JSON数据中取出相关数据
参考: http://www.cnblogs.com/shuilangyizu/p/6019561.html JSON数据如下: { "total": 1, "rows& ...
- 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题
1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...
- Json数据中的特殊字符处理
今天在项目中遇到一个问题,页面上的数据突然显示不出来了,查验后得知是Json数据出现了问题.使用JSON从后台向前台传输数据的时候,当数据本身含有一些特殊字符,会导致JSON数据的解析出错.如果内容中 ...
- JsonPath如何获取JSON数据中的值
场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值. 响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速 ...
- Json数据中同字段不同数据类型的解析
当解析Json数据时,如果碰到同字段不同数据类型的情况,如何处理呢?比如: [ { "code": 1, "data": 33 }, { "code& ...
- ajax 请求json数据中json对象的构造获取问题
前端的界面中,我想通过ajax来调用写好的json数据,并调用add(data)方法进行解析,请求如下: json数据如下: { “type”:"qqq", "lat&q ...
- Java之Hashmap中value为null,则返回json数据中key不存在
前两天干活儿的时候,将实例对象放在Hashmap中返回给前端: ArtificialEntity artificialEntity = artificialService.getInfoById(id ...
随机推荐
- htaccess转换httpd.ini方法及案例参考
案例1:httpd.ini适合IIS使用,.htaccess适合Apache使用,nginx.conf适合Nginx使用 转换前:httpd.ini [ISAPI_Rewrite] # 3600 = ...
- win8.1x64下完美运行IE6
IE6我相信是所有前端人员永远都绕不过去的坎,操作的版本越来越高,离xp越来越远,难道你还在win8下安装个虚拟机来运行IE6吗?这样即消耗系统资源,来回的切换也麻烦,关键是只为了一个测试哦,没必要这 ...
- 从零开始的全栈工程师——js篇2.13(字符串与数组的方法)
基类Object的子类有 Function Array Number Boolean String Date Math RegExp 函数 数组 数字 布尔 字符串 日期 算数 正则 都 ...
- 从零开始的全栈工程师——js篇2.9(this详解)
this 一.this是js的一个关键字 指定一个对象然后去替代他 只研究函数内的this 分两种 函数内的this和函数外的this1)函数内的this指向行为发生的主体2)函数外的this都 ...
- cf1040E. Network Safety(并查集)
题意 题目链接 一张图,n个点,m条边,每个点有个权值x,x<=1e18.如果一条边的两个端点不一样,那么这条边是安全的,开始时所有边都是安全的. 现在有一个病毒y,病毒可以入侵任意的点,入侵一 ...
- codevs 1664 清凉冷水
1664 清凉冷水 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 闷热的夏天,威斯康辛州的奶制品地区提供冷水供奶牛 ...
- base、self标签
以新的窗口打开页面 self在自己的窗口打开
- Table中采用JQuery slideToggle效果的问题
需求:用JQuery实现,点击最上边的粗加号时,对所有含有子表的Tr进行展开,点击 + 号时,只对当前Tr的下一个tr内容的动态隐藏和显示: 问题:JQuery的slideToggle() slide ...
- 【web】movie review——静态页面训练、css训练
实现样式要求: image: banner.png: generaloverview.png: background.png: bannerbackground.png: rottenbig.png: ...
- 数据类型 -- uint32_t 类型
整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型 ...