2017-09-27 69 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

你是对的,它不是更有效率。但我认为是更清洁一点 –

相关问题