如何利用JAVA正則表達式輕松替換JSON中的大字段
(一)背景
在軟件開發(fā)工作中我們經(jīng)常用JSON來傳輸數(shù)據(jù),根據(jù)業(yè)務需要不免會在JSON數(shù)據(jù)中傳輸比較大的數(shù)據(jù),有時傳輸一個圖片數(shù)據(jù)會達到幾百K或者幾M,而這些大字段數(shù)據(jù)在記錄日志時,不論是文件日志還是數(shù)據(jù)庫日志,都會造成大量的IO處理,使接口的響應速度大幅下降,同時會增加服務的負載,降低系統(tǒng)的性能。這時我們可以選擇不輸出這個JSON數(shù)據(jù),但往往這樣會造成更大的問題,因此我們會想如果只不輸出大字段數(shù)據(jù),而其他數(shù)據(jù)正常輸出就好了,但從技術上往往不易實現(xiàn)。本文就是給大家提供一種方法,利用JAVA的正則表達式簡單方便的替換掉這些大字段,同時不影響其他JSON字段的輸出。
(二)正則表達式
我們在這里就不詳細介紹正則表達式的用法了,只針對大字段匹配相關的正則表達式進行講解。
- 匹配JSON 字段的字段值的正則表達式
“:\s*\".+?\"” - 匹配超過1000的長度的正則表達式
.{1000,} - 結合以上的兩個正則表達式
(?=.{1000,})(:\s*\".+?\")
(三)在JAVA代碼中的實現(xiàn)
在這里寫一個小例子
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
String pattern = "(?=.{10,})(:\\s*\\\".+?\\\")";
json = json.replaceAll(pattern, ":\"*\"");
System.out.println(json);
執(zhí)行結果
{"name":"*","px":"*"}
怎么回事?和預想不一致,看來事情并不那樣的簡單,查一下?=的用法,現(xiàn)在這種寫法相當來說是兩個正則的邏輯與, .{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);
執(zhí)行結果
{"name":"*"abcdefg11111111111111111111111111"}
阿來,怎么會這樣。他竟然匹配到了。。。
{“name”:“Tom”,“px”:“abcdefg11111111111111111111111111”}
隨然還是不對,但離勝利只差一步了,我們在匹配中用的是.{10,},可以匹配任何字符,因此才會造成這種問題,那么我們把正常值中不應該出現(xiàn)的字符排除掉不就可以了嗎。
(五)最終結果
String json = "{\"name\":\"Tom\",\"px\":\"abcdefg11111111111111111111111111\"}";
String pattern = "(:\s*\"[^,\":]{10,}?\")";
json = json.replaceAll(pattern, ":\"*\"");
System.out.println(json);
執(zhí)行結果
{"name":"Tom","px":"*"}
我們終于得到了想要的結果。
(六)所感
其實大家都覺得正則表達式比較高深,但如果我們了解了它的原理,正確的應用到工作中,會得到意想不到的驚喜。
有時由于用法不當可能馬上得不到我們想要的結果,但我認為先不要輕易放棄而改變方向,而要分析造成問題的原因并想辦法解決,這樣對正則表達式的理解和使用能力才能不斷提高,希望這篇文章能對大家有所幫助。
到此這篇關于如何利用JAVA正則表達式輕松替換JSON中大字段的文章就介紹到這了,更多相關JAVA正則表達式替換JSON大字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java程序的初始化順序,static{}靜態(tài)代碼塊和實例語句塊的使用方式
這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實例語句塊的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Java在讀取文件內(nèi)容的時候,如何判斷出空白行的操作
這篇文章主要介紹了Java在讀取文件內(nèi)容的時候,如何判斷出空白行的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
spring boot jpa寫原生sql報Cannot resolve table錯誤解決方法
在本篇文章里小編給大家整理的是關于spring boot jpa寫原生sql報Cannot resolve table錯誤的解決方法,需要的朋友學習下。2019-11-11
支付寶二面:使用?try-catch?捕獲異常會影響性能嗎(推薦)
這篇文章主要介紹了支付寶二面:使用?try-catch?捕獲異常會影響性能嗎,需要注意的是,JVM?中?異常處理的catch語句不再由字節(jié)碼指令來實現(xiàn)(很早之前通過?jsr和?ret指令來完成,需要的朋友可以參考下2023-03-03
Spring的請求映射handlerMapping以及原理詳解
這篇文章主要介紹了Spring的請求映射handlerMapping以及原理詳解,我們每次發(fā)請求,它到底是怎么找到我們哪個方法來去處理這個請求,因為我們知道所有的請求過來都會來到DispatcherServlet,springboot底層還是使用的是springMVC,需要的朋友可以參考下2023-08-08
Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù)
這篇文章主要介紹了Java 實現(xiàn)多線程切換等待喚醒交替打印奇偶數(shù) ,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
Springboot創(chuàng)建項目的圖文教程(idea版本)
這篇文章主要介紹了Springboot創(chuàng)建項目的圖文教程(idea版本),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

