diff --git a/src/com/wentch/redkale/convert/json/JsonByteBufferWriter.java b/src/com/wentch/redkale/convert/json/JsonByteBufferWriter.java index bb7c46ee3..fd2af56a6 100644 --- a/src/com/wentch/redkale/convert/json/JsonByteBufferWriter.java +++ b/src/com/wentch/redkale/convert/json/JsonByteBufferWriter.java @@ -197,50 +197,47 @@ public final class JsonByteBufferWriter extends JsonWriter { writeNull(); return; } - ByteBuffer buffer = this.buffers[index]; - expand(1); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '"'); - - for (char ch : Utility.charArray(value)) { + final char[] chs = Utility.charArray(value); + int len = 0; + for (char ch : chs) { switch (ch) { - case '\n': expand(2); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '\\'); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) 'n'); + case '\n': len += 2; break; - case '\r': expand(2); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '\\'); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) 'r'); + case '\r': len += 2; break; - case '\t': expand(2); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '\\'); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) 't'); + case '\t': len += 2; break; - case '\\': expand(2); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '\\'); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '\\'); + case '\\': len += 2; break; - case '"': expand(2); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '\\'); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '"'); + case '"': len += 2; break; - default: buffer = putChar(buffer, ch); + default: len++; break; } } - expand(1); - if (!buffer.hasRemaining()) buffer = nextByteBuffer(); - buffer.put((byte) '"'); + if (len == chs.length) { + writeTo(true, chs, 0, len); + } else { + StringBuilder sb = new StringBuilder(len); + for (char ch : chs) { + switch (ch) { + case '\n': sb.append("\\n"); + break; + case '\r': sb.append("\\r"); + break; + case '\t': sb.append("\\t"); + break; + case '\\': sb.append("\\\\"); + break; + case '"': sb.append("\\\""); + break; + default: sb.append(ch); + break; + } + } + char[] cs = Utility.charArray(sb); + writeTo(true, cs, 0, sb.length()); + } } @Override