一、需求

现有一个字符串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(踩过的坑)...相关推荐

  1. 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 ...

  2. java数组-如何在一堆数据中使用数组!

    数组 1.类型一致的一组数据,其实相当于集合概念. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来 ...

  3. 右斜杠 java chr_PHP(5.3+)中的\(反斜杠)有什么作用?

    命名空间 在PHP 5.3+中,反斜杠\符号用于名称空间.它是指示命名空间的起始符号,也用作子命名空间名称之间的分隔符. 请参阅有关 Opcache 此外,在PHP 7.0以上版本的一些功能被替换操作 ...

  4. PTA Java版 有重复的数据

    有重复的数据(java) 在一大堆数据中找出重复的是一件经常要做的事情.现在,我们要处理许多整数,在这些整数中,可能存在重复的数据. 你要写一个程序来做这件事情,读入数据,检查是否有重复的数据.如果有 ...

  5. 从vue文件中抽取出子组件的流程及过程中踩过的坑

    流程: 1. 确保注册.引入子组件的正确性: 创建一个新的vue文件,包含基本的template,及export的内容,其中可简单包含空的data函数.暂时先不把子组件中的代码移出.在父组件中impo ...

  6. java对象转json字符串日期格式_fastJSON字符串类型数据中的日期转换为Java bean的日期对象...

    fastJSON字符串类型数据中的日期转换为Java bean的日期对象 Person.java import java.io.Serializable; import java.util.Date; ...

  7. json数据解析与JAVA对象转换以及在JQUERY中的使用

    JSON基础了解 JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小 ...

  8. java 获取json的值_Java如何获取JSON数据中的值

    场景:在接口自动化场景中,下个接口发送的请求参数,依赖上个接口请求结果中的值.需要将获取值作为全局参数引用. import java.io.File; import java.io.FileInput ...

  9. Java如何获取JSON数据中的值 备忘

    Java如何获取JSON数据中的值 取出JsonArray中的object(orderNo) 嵌套 JsonObeject {    JsonObeject {       JsonArray [Ob ...

最新文章

  1. java 同步方式 lock_Java的同步锁(Lock)
  2. Vue进行格式化时间Y-m-d h:m:s
  3. php如何缩小图片,PHP图片缩小函数一例
  4. 7-1 多数组排序 (12 分)三种做法(冒泡排序 ; 重写sort方法 ;利用sort和栈)
  5. 安卓开发面试题及答案,一次哔哩哔哩面试经历,年薪50W
  6. 【原型设计】第三节:Axure RP9 母版的使用说明以及操作教程
  7. dll放在unity哪个文件夹下_unity调用C#dll文件
  8. imu 里程计融合_多传感器融合 RLINS概述
  9. 超赞!终于有网友用Java实现了第三方qq账号登录...
  10. [安全攻防进阶篇] 三.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏
  11. 想知道“照片识别文字”的技巧吗?快看这几个方法
  12. 攻城狮还是产品运营?
  13. 怎么批量在文件名前面加上数字序号,对文件进行编号排序?
  14. Django——08.with语句,url标签, 解析特殊字符查verbatim
  15. 论“黄海和渤海开凿人工运河的分析”(最新)
  16. js动态函数(方法)
  17. C语言十进制转八进制
  18. 微信缴纳罚款无法连接服务器,为什么我的违章罚款在微信上交不了?原因竟是…...
  19. 《THE BASIC GRAMMER OF C》
  20. java毕业设计物流企业健康管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

热门文章

  1. php masonry,jQuery Masonry瀑布流布局详解
  2. sgi集群管理软件SMC安装步骤整理
  3. atmega16单片机c语言程序设计经典实例pdf,Atmega16单片机实用程序.pdf
  4. 【Python数据分析】波士顿房价分析小例子
  5. Qt warning Pass a context object as connect 3th paramter
  6. 微信小程序体验(1):携程酒店机票火车票
  7. 2022新的Echarts Demo 网址
  8. 群辉中使用私有Docker Registry
  9. 迅雷联合创始人程浩首次反思:我们为何错失三大机遇?
  10. 权力的游戏第八季在线观看