如何利用JAVA正则表达式轻松替换JSON中的大字段
(一)背景
在软件开发工作中我们经常用JSON来传输数据,根据业务需要不免会在JSON数据中传输比较大的数据,有时传输一个图片数据会达到几百K或者几M,而这些大字段数据在记录日志时,不论是文件日志还是数据库日志,都会造成大量的IO处理,使接口的响应速度大幅下降,同时会增加服务的负载,降低系统的性能。这时我们可以选择不输出这个JSON数据,但往往这样会造成更大的问题,因此我们会想如果只不输出大字段数据,而其他数据正常输出就好了,但从技术上往往不易实现。本文就是给大家提供一种方法,利用JAVA的正则表达式简单方便的替换掉这些大字段,同时不影响其他JSON字段的输出。
(二)正则表达式
我们在这里就不详细介绍正则表达式的用法了,只针对大字段匹配相关的正则表达式进行讲解。
- 匹配JSON 字段的字段值的正则表达式
“:\s*\".+?\"” - 匹配超过1000的长度的正则表达式
.{1000,} - 结合以上的两个正则表达式
(?=.{1000,})(:\s*\".+?\")
(三)在JAVA代码中的实现
在这里写一个小例子
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}"; String pattern = "(?=.{10,})(:\\s*\\\".+?\\\")"; json = json.replaceAll(pattern, ":\"*\""); System.out.println(json);
执行结果
{"name":"*","px":"*"}
怎么回事?和预想不一致,看来事情并不那样的简单,查一下?=的用法,现在这种写法相当来说是两个正则的逻辑与, .{10,}是匹配了一行超过10个字符,而(:\s*".+?")则匹配了json的值项目,也就是说只要这一行超过了10个字符,那么其中的json值都会被替换。知道了原因我们就好办了。把两个正则合为一个正则不就OK了吗。
(四)合并正则表达式
我们改善以下上面的例子,
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}"; String pattern = "(:\\s*\\\".{10,}?\\\")"; json = json.replaceAll(pattern, ":\"*\""); System.out.println(json);
执行结果
{"name":"*"abcdefg11111111111111111111111111"}
阿来,怎么会这样。他竟然匹配到了。。。
{“name”:“Tom”,“px”:“abcdefg11111111111111111111111111”}
随然还是不对,但离胜利只差一步了,我们在匹配中用的是.{10,},可以匹配任何字符,因此才会造成这种问题,那么我们把正常值中不应该出现的字符排除掉不就可以了吗。
(五)最终结果
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}"; String pattern = "(:\s*\"[^,\":]{10,}?\")"; json = json.replaceAll(pattern, ":\"*\""); System.out.println(json);
执行结果
{"name":"Tom","px":"*"}
我们终于得到了想要的结果。
(六)所感
其实大家都觉得正则表达式比较高深,但如果我们了解了它的原理,正确的应用到工作中,会得到意想不到的惊喜。
有时由于用法不当可能马上得不到我们想要的结果,但我认为先不要轻易放弃而改变方向,而要分析造成问题的原因并想办法解决,这样对正则表达式的理解和使用能力才能不断提高,希望这篇文章能对大家有所帮助。
到此这篇关于如何利用JAVA正则表达式轻松替换JSON中大字段的文章就介绍到这了,更多相关JAVA正则表达式替换JSON大字段内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!