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 {
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);
}
/**
* <b>注意:</b> 该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

View File

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

View File

@@ -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) {

View File

@@ -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 的字符
/**
* <b>注意:</b> 该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);