diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java b/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java index 99e8bfed8..455ca94c3 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java @@ -22,9 +22,11 @@ import org.redkale.util.*; */ public class JsonByteBufferWriter extends JsonWriter { - private static final char[] CHARS_TUREVALUE = "true".toCharArray(); + private static final byte[] BYTES_TUREVALUE = "true".getBytes(); - private static final char[] CHARS_FALSEVALUE = "false".toCharArray(); + private static final byte[] BYTES_FALSEVALUE = "false".getBytes(); + + private static final byte[] BYTES_NULL = new byte[] {'n', 'u', 'l', 'l'}; protected Charset charset; @@ -313,6 +315,11 @@ public class JsonByteBufferWriter extends JsonWriter { return size; } + @Override + public final void writeNull() { + writeTo(BYTES_NULL); + } + /** * 注意: 该String值不能为null且不会进行转义, 只用于不含需要转义字符的字符串,例如enum、double、BigInteger、BigDecimal转换的String * @@ -361,6 +368,9 @@ public class JsonByteBufferWriter extends JsonWriter { @Override public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) { + if (!value && tiny()) { + return comma; + } return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value)); } @@ -386,8 +396,13 @@ public class JsonByteBufferWriter extends JsonWriter { @Override public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) { - if (value == null && !nullable()) { - return comma; + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } byte[] bs1 = (byte[]) fieldArray; int expandsize = expand(1 + bs1.length); @@ -411,7 +426,15 @@ public class JsonByteBufferWriter extends JsonWriter { @Override public boolean writeFieldStringValue(Object fieldArray, boolean comma, String value) { - if (value == null || (tiny() && value.isEmpty())) { + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } + } + if (tiny() && value.isEmpty()) { return comma; } byte[] bs1 = (byte[]) fieldArray; @@ -434,9 +457,45 @@ public class JsonByteBufferWriter extends JsonWriter { return true; } + @Override + protected void writeFieldNull(Object fieldArray, boolean comma) { + byte[] bs1 = (byte[]) fieldArray; + byte[] bs2 = BYTES_NULL; + int expandsize = expand(bs1.length + bs2.length + 3); + if (expandsize == 0) { // 只需要一个buffer + final ByteBuffer buffer = this.buffers[currBufIndex]; + if (comma) buffer.put(BYTE_COMMA); + buffer.put(bs1); + buffer.put(bs2); + } else { + ByteBuffer buffer = this.buffers[currBufIndex]; + if (comma) buffer.put(BYTE_COMMA); + for (byte b : bs1) { + if (!buffer.hasRemaining()) { + buffer = nextByteBuffer(); + } + buffer.put(b); + } + for (byte b : bs2) { + if (!buffer.hasRemaining()) { + buffer = nextByteBuffer(); + } + buffer.put(b); + } + } + } + @Override protected boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value) { - if (value == null || (tiny() && value.isEmpty())) { + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } + } + if (tiny() && value.isEmpty()) { return comma; } byte[] bs1 = (byte[]) fieldArray; @@ -482,7 +541,7 @@ public class JsonByteBufferWriter extends JsonWriter { @Override public void writeBoolean(boolean value) { - writeTo(value ? CHARS_TUREVALUE : CHARS_FALSEVALUE); + writeTo(value ? BYTES_TUREVALUE : BYTES_FALSEVALUE); } @Override diff --git a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java index 374bdc625..96514a3f0 100644 --- a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java @@ -109,7 +109,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { } @Override - public void writeNull() { + public final void writeNull() { writeTo(BYTES_NULL); } @@ -186,6 +186,9 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { @Override public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) { + if (!value && tiny()) { + return comma; + } byte[] bs1 = (byte[]) fieldArray; byte[] bs2 = value ? BYTES_TUREVALUE : BYTES_FALSEVALUE; int len1 = bs1.length; @@ -245,8 +248,13 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { @Override public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) { - if (value == null && !nullable()) { - return comma; + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } byte[] bs1 = (byte[]) fieldArray; int len1 = bs1.length; @@ -260,7 +268,15 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { @Override public boolean writeFieldStringValue(Object fieldArray, boolean comma, String value) { - if (value == null || (tiny() && value.isEmpty())) { + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } + } + if (tiny() && value.isEmpty()) { return comma; } byte[] bs1 = (byte[]) fieldArray; @@ -273,9 +289,31 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { return true; } + @Override + protected void writeFieldNull(Object fieldArray, boolean comma) { + byte[] bs1 = (byte[]) fieldArray; + byte[] bs2 = BYTES_NULL; + int len1 = bs1.length; + int len2 = bs2.length; + byte[] src = expand(1 + len1 + len2); + if (comma) src[count++] = BYTE_COMMA; + System.arraycopy(bs1, 0, src, count, len1); + count += len1; + System.arraycopy(bs2, 0, src, count, len2); + count += len2; + } + @Override protected boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value) { - if (value == null || (tiny() && value.isEmpty())) { + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } + } + if (tiny() && value.isEmpty()) { return comma; } byte[] bs1 = (byte[]) fieldArray; diff --git a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java index 967737f93..6f83d5dfd 100644 --- a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java @@ -27,6 +27,8 @@ public class JsonCharsWriter extends JsonWriter { private static final char[] CHARS_FALSEVALUE = "false".toCharArray(); + private static final char[] CHARS_NULL = new char[] {'n', 'u', 'l', 'l'}; + private static final int TENTHOUSAND_MAX = 10001; private static final char[][] TENTHOUSAND_CHARS = new char[TENTHOUSAND_MAX][]; @@ -141,6 +143,9 @@ public class JsonCharsWriter extends JsonWriter { @Override public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) { + if (!value && tiny()) { + return comma; + } char[] bs1 = (char[]) fieldArray; char[] bs2 = value ? CHARS_TUREVALUE : CHARS_FALSEVALUE; int len1 = bs1.length; @@ -200,8 +205,13 @@ public class JsonCharsWriter extends JsonWriter { @Override public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) { - if (value == null && !nullable()) { - return comma; + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } char[] bs1 = (char[]) fieldArray; int len1 = bs1.length; @@ -215,7 +225,15 @@ public class JsonCharsWriter extends JsonWriter { @Override public boolean writeFieldStringValue(Object fieldArray, boolean comma, String value) { - if (value == null || (tiny() && value.isEmpty())) { + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } + } + if (tiny() && value.isEmpty()) { return comma; } char[] bs1 = (char[]) fieldArray; @@ -228,9 +246,31 @@ public class JsonCharsWriter extends JsonWriter { return true; } + @Override + protected void writeFieldNull(Object fieldArray, boolean comma) { + char[] bs1 = (char[]) fieldArray; + char[] bs2 = CHARS_NULL; + int len1 = bs1.length; + int len2 = bs2.length; + char[] src = expand(1 + len1 + len2); + if (comma) src[count++] = BYTE_COMMA; + System.arraycopy(bs1, 0, src, count, len1); + count += len1; + System.arraycopy(bs2, 0, src, count, len2); + count += len2; + } + @Override protected boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value) { - if (value == null || (tiny() && value.isEmpty())) { + if (value == null) { + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } + } + if (tiny() && value.isEmpty()) { return comma; } char[] bs1 = (char[]) fieldArray; @@ -265,6 +305,11 @@ public class JsonCharsWriter extends JsonWriter { return this.count; } + @Override + public final void writeNull() { + writeTo(CHARS_NULL); + } + @Override public void writeString(String value) { if (value == null) { diff --git a/src/main/java/org/redkale/convert/json/JsonWriter.java b/src/main/java/org/redkale/convert/json/JsonWriter.java index 2dc8f4f88..449fc09f6 100644 --- a/src/main/java/org/redkale/convert/json/JsonWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonWriter.java @@ -22,8 +22,6 @@ public abstract class JsonWriter extends Writer { "redkale.convert.json.writer.buffer.defsize", Integer.getInteger("redkale.convert.writer.buffer.defsize", 1024)); - private static final char[] CHARS_NULL = new char[] {'n', 'u', 'l', 'l'}; - protected static final byte BYTE_NEGATIVE = '-'; protected static final byte BYTE_COMMA = ','; @@ -61,12 +59,11 @@ public abstract class JsonWriter extends Writer { // ----------------------------------------------------------------------- public abstract void writeTo(final char ch); // 只能是 0 - 127 的字符 - public abstract void writeTo(final char[] chs, final int start, final int len); // 只能是 0 - 127 的字符 + public abstract void writeTo(final char[] cs, final int start, final int len); // 只能是 0 - 127 的字符 public abstract void writeTo(final byte ch); // 只能是 0 - 127 的字符 - public abstract void writeTo(final byte[] chs, final int start, final int len); // 只能是 0 - 127 的字符 - + public abstract void writeTo(final byte[] bs, final int start, final int len); // 只能是 0 - 127 的字符 /** * 注意: 该String值不能为null且不会进行转义, 只用于不含需要转义字符的字符串,例如enum、double、BigInteger、BigDecimal转换的String * @@ -76,6 +73,10 @@ public abstract class JsonWriter extends Writer { @ClassDepends public abstract void writeLatin1To(final boolean quote, final String value); + @Override + @ClassDepends + public abstract void writeNull(); + // ---------------------------- writeFieldXXXValue 调用前不需要判断值是否为null ---------------------------- @ClassDepends public abstract boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value); @@ -110,7 +111,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldBooleanValue(Object fieldArray, boolean comma, Boolean value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldBooleanValue(fieldArray, comma, value.booleanValue()); } @@ -118,7 +124,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldByteValue(Object fieldArray, boolean comma, Byte value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldByteValue(fieldArray, comma, value.byteValue()); } @@ -126,7 +137,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldShortValue(Object fieldArray, boolean comma, Short value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldShortValue(fieldArray, comma, value.shortValue()); } @@ -134,7 +150,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldCharValue(Object fieldArray, boolean comma, Character value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldIntValue(fieldArray, comma, value.charValue()); } @@ -142,7 +163,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldIntValue(Object fieldArray, boolean comma, Integer value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldIntValue(fieldArray, comma, value.intValue()); } @@ -150,7 +176,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldFloatValue(Object fieldArray, boolean comma, Float value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value)); } @@ -158,7 +189,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldLongValue(Object fieldArray, boolean comma, Long value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldLongValue(fieldArray, comma, value.longValue()); } @@ -166,7 +202,12 @@ public abstract class JsonWriter extends Writer { @ClassDepends public final boolean writeFieldDoubleValue(Object fieldArray, boolean comma, Double value) { if (value == null) { - return comma; + if (nullable()) { + writeFieldNull(fieldArray, comma); + return true; + } else { + return comma; + } } return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value)); } @@ -183,6 +224,8 @@ public abstract class JsonWriter extends Writer { public abstract boolean writeFieldObjectValue( Object fieldArray, boolean comma, Encodeable encodeable, Object value); + protected abstract void writeFieldNull(Object fieldArray, boolean comma); + protected abstract boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value); // ---------------------------- writeFieldXXXValue 主要供JsonDynEncoder使用 ---------------------------- @@ -228,12 +271,12 @@ public abstract class JsonWriter extends Writer { } // ---------------------------------------------------------------------------------------------- - public final void writeTo(final char... chs) { // 只能是 0 - 127 的字符 - writeTo(chs, 0, chs.length); + public final void writeTo(final char... cs) { // 只能是 0 - 127 的字符 + writeTo(cs, 0, cs.length); } - public final void writeTo(final byte[] chs) { // 只能是 0 - 127 的字符 - writeTo(chs, 0, chs.length); + public final void writeTo(final byte[] bs) { // 只能是 0 - 127 的字符 + writeTo(bs, 0, bs.length); } @Override @@ -290,11 +333,6 @@ public abstract class JsonWriter extends Writer { writeTo(BYTE_RBRACE); } - @Override - public void writeNull() { - writeTo(CHARS_NULL); - } - @Override public final void writeArrayB(int size, Encodeable componentEncoder, Object obj) { writeTo(BYTE_LBRACKET);