1. 程式人生 > 程式設計 >如何利用JAVA正則表示式輕鬆替換JSON中的大欄位

如何利用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大欄位內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!