我有一些代码来屏蔽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个正则表达式合并为一个更多?它并不总是以正确的方式找到它,所以掩蔽失败了。
我会避免在结构化语言(如JSON)中执行任何类型的替换,方法是将它视为String并使用正则表达式开始。很难说这里的效率(因为它也将取决于有效负载和事件的大小等),但为了可读性/可维护性,您可能希望使用JSON解析器/写入器来代替并重新创建对象。 – Mena