This commit is contained in:
redkale
2024-10-17 12:10:54 +08:00
parent 7586577521
commit 57686cf221
4 changed files with 218 additions and 38 deletions

View File

@@ -22,9 +22,11 @@ import org.redkale.util.*;
*/ */
public class JsonByteBufferWriter extends JsonWriter { 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; protected Charset charset;
@@ -313,6 +315,11 @@ public class JsonByteBufferWriter extends JsonWriter {
return size; return size;
} }
@Override
public final void writeNull() {
writeTo(BYTES_NULL);
}
/** /**
* <b>注意:</b> 该String值不能为null且不会进行转义 只用于不含需要转义字符的字符串例如enum、double、BigInteger、BigDecimal转换的String * <b>注意:</b> 该String值不能为null且不会进行转义 只用于不含需要转义字符的字符串例如enum、double、BigInteger、BigDecimal转换的String
* *
@@ -361,6 +368,9 @@ public class JsonByteBufferWriter extends JsonWriter {
@Override @Override
public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) { public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) {
if (!value && tiny()) {
return comma;
}
return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value)); return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value));
} }
@@ -386,8 +396,13 @@ public class JsonByteBufferWriter extends JsonWriter {
@Override @Override
public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) { public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) {
if (value == null && !nullable()) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;
int expandsize = expand(1 + bs1.length); int expandsize = expand(1 + bs1.length);
@@ -411,7 +426,15 @@ public class JsonByteBufferWriter extends JsonWriter {
@Override @Override
public boolean writeFieldStringValue(Object fieldArray, boolean comma, String value) { 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; return comma;
} }
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;
@@ -434,9 +457,45 @@ public class JsonByteBufferWriter extends JsonWriter {
return true; 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 @Override
protected boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value) { 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; return comma;
} }
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;
@@ -482,7 +541,7 @@ public class JsonByteBufferWriter extends JsonWriter {
@Override @Override
public void writeBoolean(boolean value) { public void writeBoolean(boolean value) {
writeTo(value ? CHARS_TUREVALUE : CHARS_FALSEVALUE); writeTo(value ? BYTES_TUREVALUE : BYTES_FALSEVALUE);
} }
@Override @Override

View File

@@ -109,7 +109,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
} }
@Override @Override
public void writeNull() { public final void writeNull() {
writeTo(BYTES_NULL); writeTo(BYTES_NULL);
} }
@@ -186,6 +186,9 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
@Override @Override
public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) { public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) {
if (!value && tiny()) {
return comma;
}
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;
byte[] bs2 = value ? BYTES_TUREVALUE : BYTES_FALSEVALUE; byte[] bs2 = value ? BYTES_TUREVALUE : BYTES_FALSEVALUE;
int len1 = bs1.length; int len1 = bs1.length;
@@ -245,8 +248,13 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
@Override @Override
public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) { public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) {
if (value == null && !nullable()) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;
int len1 = bs1.length; int len1 = bs1.length;
@@ -260,7 +268,15 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
@Override @Override
public boolean writeFieldStringValue(Object fieldArray, boolean comma, String value) { 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; return comma;
} }
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;
@@ -273,9 +289,31 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
return true; 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 @Override
protected boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value) { 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; return comma;
} }
byte[] bs1 = (byte[]) fieldArray; byte[] bs1 = (byte[]) fieldArray;

View File

@@ -27,6 +27,8 @@ public class JsonCharsWriter extends JsonWriter {
private static final char[] CHARS_FALSEVALUE = "false".toCharArray(); 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 int TENTHOUSAND_MAX = 10001;
private static final char[][] TENTHOUSAND_CHARS = new char[TENTHOUSAND_MAX][]; private static final char[][] TENTHOUSAND_CHARS = new char[TENTHOUSAND_MAX][];
@@ -141,6 +143,9 @@ public class JsonCharsWriter extends JsonWriter {
@Override @Override
public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) { public boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value) {
if (!value && tiny()) {
return comma;
}
char[] bs1 = (char[]) fieldArray; char[] bs1 = (char[]) fieldArray;
char[] bs2 = value ? CHARS_TUREVALUE : CHARS_FALSEVALUE; char[] bs2 = value ? CHARS_TUREVALUE : CHARS_FALSEVALUE;
int len1 = bs1.length; int len1 = bs1.length;
@@ -200,8 +205,13 @@ public class JsonCharsWriter extends JsonWriter {
@Override @Override
public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) { public boolean writeFieldObjectValue(Object fieldArray, boolean comma, Encodeable encodeable, Object value) {
if (value == null && !nullable()) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
char[] bs1 = (char[]) fieldArray; char[] bs1 = (char[]) fieldArray;
int len1 = bs1.length; int len1 = bs1.length;
@@ -215,7 +225,15 @@ public class JsonCharsWriter extends JsonWriter {
@Override @Override
public boolean writeFieldStringValue(Object fieldArray, boolean comma, String value) { 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; return comma;
} }
char[] bs1 = (char[]) fieldArray; char[] bs1 = (char[]) fieldArray;
@@ -228,9 +246,31 @@ public class JsonCharsWriter extends JsonWriter {
return true; 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 @Override
protected boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value) { 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; return comma;
} }
char[] bs1 = (char[]) fieldArray; char[] bs1 = (char[]) fieldArray;
@@ -265,6 +305,11 @@ public class JsonCharsWriter extends JsonWriter {
return this.count; return this.count;
} }
@Override
public final void writeNull() {
writeTo(CHARS_NULL);
}
@Override @Override
public void writeString(String value) { public void writeString(String value) {
if (value == null) { if (value == null) {

View File

@@ -22,8 +22,6 @@ public abstract class JsonWriter extends Writer {
"redkale.convert.json.writer.buffer.defsize", "redkale.convert.json.writer.buffer.defsize",
Integer.getInteger("redkale.convert.writer.buffer.defsize", 1024)); 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_NEGATIVE = '-';
protected static final byte BYTE_COMMA = ','; 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 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 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 的字符
/** /**
* <b>注意:</b> 该String值不能为null且不会进行转义 只用于不含需要转义字符的字符串例如enum、double、BigInteger、BigDecimal转换的String * <b>注意:</b> 该String值不能为null且不会进行转义 只用于不含需要转义字符的字符串例如enum、double、BigInteger、BigDecimal转换的String
* *
@@ -76,6 +73,10 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public abstract void writeLatin1To(final boolean quote, final String value); public abstract void writeLatin1To(final boolean quote, final String value);
@Override
@ClassDepends
public abstract void writeNull();
// ---------------------------- writeFieldXXXValue 调用前不需要判断值是否为null ---------------------------- // ---------------------------- writeFieldXXXValue 调用前不需要判断值是否为null ----------------------------
@ClassDepends @ClassDepends
public abstract boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value); public abstract boolean writeFieldBooleanValue(Object fieldArray, boolean comma, boolean value);
@@ -110,7 +111,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldBooleanValue(Object fieldArray, boolean comma, Boolean value) { public final boolean writeFieldBooleanValue(Object fieldArray, boolean comma, Boolean value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldBooleanValue(fieldArray, comma, value.booleanValue()); return writeFieldBooleanValue(fieldArray, comma, value.booleanValue());
} }
@@ -118,7 +124,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldByteValue(Object fieldArray, boolean comma, Byte value) { public final boolean writeFieldByteValue(Object fieldArray, boolean comma, Byte value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldByteValue(fieldArray, comma, value.byteValue()); return writeFieldByteValue(fieldArray, comma, value.byteValue());
} }
@@ -126,7 +137,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldShortValue(Object fieldArray, boolean comma, Short value) { public final boolean writeFieldShortValue(Object fieldArray, boolean comma, Short value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldShortValue(fieldArray, comma, value.shortValue()); return writeFieldShortValue(fieldArray, comma, value.shortValue());
} }
@@ -134,7 +150,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldCharValue(Object fieldArray, boolean comma, Character value) { public final boolean writeFieldCharValue(Object fieldArray, boolean comma, Character value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldIntValue(fieldArray, comma, value.charValue()); return writeFieldIntValue(fieldArray, comma, value.charValue());
} }
@@ -142,7 +163,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldIntValue(Object fieldArray, boolean comma, Integer value) { public final boolean writeFieldIntValue(Object fieldArray, boolean comma, Integer value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldIntValue(fieldArray, comma, value.intValue()); return writeFieldIntValue(fieldArray, comma, value.intValue());
} }
@@ -150,7 +176,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldFloatValue(Object fieldArray, boolean comma, Float value) { public final boolean writeFieldFloatValue(Object fieldArray, boolean comma, Float value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value)); return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value));
} }
@@ -158,7 +189,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldLongValue(Object fieldArray, boolean comma, Long value) { public final boolean writeFieldLongValue(Object fieldArray, boolean comma, Long value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldLongValue(fieldArray, comma, value.longValue()); return writeFieldLongValue(fieldArray, comma, value.longValue());
} }
@@ -166,7 +202,12 @@ public abstract class JsonWriter extends Writer {
@ClassDepends @ClassDepends
public final boolean writeFieldDoubleValue(Object fieldArray, boolean comma, Double value) { public final boolean writeFieldDoubleValue(Object fieldArray, boolean comma, Double value) {
if (value == null) { if (value == null) {
return comma; if (nullable()) {
writeFieldNull(fieldArray, comma);
return true;
} else {
return comma;
}
} }
return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value)); return writeFieldLatin1Value(fieldArray, comma, false, String.valueOf(value));
} }
@@ -183,6 +224,8 @@ public abstract class JsonWriter extends Writer {
public abstract boolean writeFieldObjectValue( public abstract boolean writeFieldObjectValue(
Object fieldArray, boolean comma, Encodeable encodeable, Object value); 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); protected abstract boolean writeFieldLatin1Value(Object fieldArray, boolean comma, boolean quote, String value);
// ---------------------------- writeFieldXXXValue 主要供JsonDynEncoder使用 ---------------------------- // ---------------------------- writeFieldXXXValue 主要供JsonDynEncoder使用 ----------------------------
@@ -228,12 +271,12 @@ public abstract class JsonWriter extends Writer {
} }
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
public final void writeTo(final char... chs) { // 只能是 0 - 127 的字符 public final void writeTo(final char... cs) { // 只能是 0 - 127 的字符
writeTo(chs, 0, chs.length); writeTo(cs, 0, cs.length);
} }
public final void writeTo(final byte[] chs) { // 只能是 0 - 127 的字符 public final void writeTo(final byte[] bs) { // 只能是 0 - 127 的字符
writeTo(chs, 0, chs.length); writeTo(bs, 0, bs.length);
} }
@Override @Override
@@ -290,11 +333,6 @@ public abstract class JsonWriter extends Writer {
writeTo(BYTE_RBRACE); writeTo(BYTE_RBRACE);
} }
@Override
public void writeNull() {
writeTo(CHARS_NULL);
}
@Override @Override
public final void writeArrayB(int size, Encodeable componentEncoder, Object obj) { public final void writeArrayB(int size, Encodeable componentEncoder, Object obj) {
writeTo(BYTE_LBRACKET); writeTo(BYTE_LBRACKET);