JsonEscape.java
package emissary.transform.decode;
import emissary.util.shell.Executrix;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@Deprecated
public class JsonEscape {
private static final String ESCAPES = "ntr\"'/\\";
/**
* Unescape a bunch of JSON bytes that might have \\uxxxx character values. Should already be UTF-8 since JSON is
* specified as UTF-8 by RFC 4627
*/
public static byte[] unescape(byte[] data) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (int i = 0; i < data.length; i++) {
if (data[i] == '\\' && (i + 5) < data.length && (data[i + 1] == 'u' || data[i + 1] == 'U')) {
// process unicode escape
try {
String s = new String(data, i + 2, 4);
char[] c = HtmlEscape.unescapeHtmlChar(s, true);
if (c != null && c.length > 0) {
out.write(new String(c).getBytes());
// logger.debug("Unicode '{}' ==> '{}'", s, new String(c));
i += 5;
} else {
out.write(data[i]);
}
} catch (IOException iox) {
out.write(data[i]);
}
} else if (data[i] == '\\' && (i + 1) < data.length && isOctalDigit(data[i + 1])) {
// Process octal escape
int end = i + 1;
if ((i + 2) < data.length && isOctalDigit(data[i + 2])) {
end++;
}
if ((i + 3) < data.length && isOctalDigit(data[i + 3])) {
end++;
}
String s = new String(data, i + 1, (end - i));
try {
int num = Integer.parseInt(s, 8);
char[] ch = Character.toChars(num);
out.write(new String(ch).getBytes());
// logger.debug("Octal '{}' ==> '{}'", s, new String(ch));
i += s.length();
} catch (Exception ex) {
out.write(data[i]);
}
} else if (data[i] == '\\' && (i + 1) < data.length && ESCAPES.indexOf(data[i + 1]) != -1) {
byte b = data[i + 1];
if (b == 'n') {
out.write('\n');
} else if (b == 't') {
out.write('\t');
} else if (b == 'r') {
out.write('\r');
} else {
out.write(b);
}
i++;
} else {
out.write(data[i]);
}
}
return out.toByteArray();
}
protected static boolean isOctalDigit(byte b) {
return (b >= '0' && b <= '7');
}
/** This class is not meant to be instantiated. */
private JsonEscape() {}
@SuppressWarnings("SystemOut")
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
byte[] content = Executrix.readDataFromFile(args[i]);
if (content == null) {
System.out.println(args[i] + ": Unreadable");
continue;
}
System.out.println(args[i]);
byte[] escaped = JsonEscape.unescape(content);
System.out.write(escaped, 0, escaped.length);
System.out.println();
}
}
}