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);