improve JSON escape, closes #6

This commit is contained in:
Jörg Prante 2019-11-06 20:50:13 +01:00
parent d4e06c58ed
commit dc303bd322

View file

@ -45,8 +45,6 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.Deflater; import java.util.zip.Deflater;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
@ -65,14 +63,6 @@ public class MarcJsonWriter extends MarcContentHandler implements Flushable, Clo
private static final int DEFAULT_BUFFER_SIZE = 65536; private static final int DEFAULT_BUFFER_SIZE = 65536;
private static final Pattern quotePattern = Pattern.compile("\"", Pattern.LITERAL);
private static final Pattern backslashPattern = Pattern.compile("\\\\");
private static final String ESCAPE_QUOTE = "\\\"";
private static final String ESCAPE_BACKSLASH = "\\\\";
private final Lock lock; private final Lock lock;
private final StringBuilder sb; private final StringBuilder sb;
@ -155,8 +145,41 @@ public class MarcJsonWriter extends MarcContentHandler implements Flushable, Clo
} }
private static String escape(String value) { private static String escape(String value) {
String s = backslashPattern.matcher(value).replaceAll(Matcher.quoteReplacement(ESCAPE_BACKSLASH)); StringBuilder sb = new StringBuilder();
return quotePattern.matcher(s).replaceAll(Matcher.quoteReplacement(ESCAPE_QUOTE)); for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
switch (c) {
case '"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
default:
if (c < 0x1f) {
sb.append("\\u").append(String.format("%04x", (int) c));
} else {
sb.append(c);
}
break;
}
}
return sb.toString();
} }
public MarcJsonWriter setIndex(String index, String indexType) { public MarcJsonWriter setIndex(String index, String indexType) {