2017-09-27 64 views
0

我有一些代碼來屏蔽json文件中的值。 但我有這樣的感覺,應該有一個更有效的方法來做到這一點。更有效的方法來替換字符串來屏蔽json文件(java)

這是我當前的代碼:

private static final String STRING_REPLACEMENT = "$1 \"String\" $4"; 
private static final String FLOAT_REPLACEMENT = "$1 \"float\" $4"; 
private static final String INT_REPLACEMENT = "$1 \"Integer\" $4"; 
private static final String BOOL_REPLACEMENT = "$1 \"Boolean\" $4"; 

和實際掩蔽代碼:

out = out.replaceAll("(\"\\w+\"\\s?:)\\s?\"((\\\\\"|[^\"])*\")", "$1 \"String\""); 
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(\\d+\\.\\d+)", "$1 \"float\""); 
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(\\d+)", "$1 \"Integer\""); 
out = out.replaceAll("(\"\\w+\"\\s?:)\\s?(true|false)", "$1 \"Boolean\""); 

out = out.replaceAll("(\\[\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
out = out.replaceAll("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
out = out.replaceAll("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?\\])", STRING_REPLACEMENT); 

out = out.replaceAll("(\\[\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+\\.\\d+)(\\s?\\])", FLOAT_REPLACEMENT); 

out = out.replaceAll("(\\[\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((\\d)+)(\\s?\\])", INT_REPLACEMENT); 

out = out.replaceAll("(\\[\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
out = out.replaceAll("(,\\s?)((true|false))(\\s?\\])", BOOL_REPLACEMENT); 

是否有人有任何建議如何改進這一點。我知道我可以對正則表達式進行分組,但是恐怕這會影響可讀性。我注意到,如果我將3個正則表達式合併爲一個更多?它並不總是以正確的方式找到它,所以掩蔽失敗了。

+2

我會避免在結構化語言(如JSON)中執行任何類型的替換,方法是將它視爲String並使用正則表達式開始。很難說這裏的效率(因爲它也將取決於有效負載和事件的大小等),但爲了可讀性/可維護性,您可能希望使用JSON解析器/寫入器來代替並重新創建對象。 – Mena

回答

1

你可以做一個HashMap與正則表達式/替換和迭代應用您的replaceAll

例如

import java.util.HashMap; 
import java.util.Map; 

public class Test { 

    private static final String STRING_REPLACEMENT = "$1 \"String\" $4"; 
    private static final String FLOAT_REPLACEMENT = "$1 \"float\" $4"; 
    private static final String INT_REPLACEMENT = "$1 \"Integer\" $4"; 
    private static final String BOOL_REPLACEMENT = "$1 \"Boolean\" $4"; 
    private static final Map<String,String> patterns; 
    static { 
     patterns = new HashMap<>(); 
     patterns.put("(\"\\w+\"\\s?:)\\s?\"((\\\\\"|[^\"])*\")", "$1 \"String\""); 
     patterns.put("(\"\\w+\"\\s?:)\\s?(\\d+\\.\\d+)", "$1 \"float\""); 
     patterns.put("(\"\\w+\"\\s?:)\\s?(\\d+)", "$1 \"Integer\""); 
     patterns.put("(\"\\w+\"\\s?:)\\s?(true|false)", "$1 \"Boolean\""); 
     patterns.put("(\\[\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
     patterns.put("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?,)", STRING_REPLACEMENT); 
     patterns.put("(,\\s?)\"((\\\\\"|[^\"])*\")(\\s?\\])", STRING_REPLACEMENT); 
     patterns.put("(\\[\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+\\.\\d+)(\\s?,)", FLOAT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+\\.\\d+)(\\s?\\])", FLOAT_REPLACEMENT); 
     patterns.put("(\\[\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+)(\\s?,)", INT_REPLACEMENT); 
     patterns.put("(,\\s?)((\\d)+)(\\s?\\])", INT_REPLACEMENT); 
     patterns.put("(\\[\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
     patterns.put("(,\\s?)((true|false))(\\s?,)", BOOL_REPLACEMENT); 
     patterns.put("(,\\s?)((true|false))(\\s?\\])", BOOL_REPLACEMENT); 
    } 
    public void test() { 
     String out="your string"; 
     for(Map.Entry<String, String> pattern :patterns.entrySet()){ 
      out = out.replaceAll(pattern.getKey(), pattern.getValue()); 
     } 
    } 
} 

但是,這將是更好的反序列化,更新值並重新系列化你json with api

+0

但是,這不會讓它更有效率。我猜它最終會變得更加低效,它會比當前的實現有更多的代碼。 –

+0

你是對的,它不是更有效率。但我認爲是更清潔一點 –

相關問題