From 50994c3f78e86e853c671cb2f43ec5f54233f0f3 Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 15 Oct 2024 15:28:48 +0800 Subject: [PATCH] =?UTF-8?q?json=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/annotation/ClassDepends.java | 2 + .../convert/json/JsonByteBufferWriter.java | 302 +----------------- .../redkale/convert/json/JsonBytesWriter.java | 188 +---------- .../redkale/convert/json/JsonCharsWriter.java | 182 +---------- .../redkale/convert/json/JsonDynEncoder.java | 214 +------------ .../org/redkale/convert/json/JsonWriter.java | 60 +--- 6 files changed, 43 insertions(+), 905 deletions(-) diff --git a/src/main/java/org/redkale/annotation/ClassDepends.java b/src/main/java/org/redkale/annotation/ClassDepends.java index ab6d2d547..7f844633b 100644 --- a/src/main/java/org/redkale/annotation/ClassDepends.java +++ b/src/main/java/org/redkale/annotation/ClassDepends.java @@ -21,4 +21,6 @@ import static java.lang.annotation.RetentionPolicy.*; public @interface ClassDepends { Class[] value() default {}; + + String comment() default ""; } diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java b/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java index 6d5ebeb97..4be94c4f8 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferWriter.java @@ -231,7 +231,7 @@ public class JsonByteBufferWriter extends JsonWriter { if (!buffer.hasRemaining()) { buffer = nextByteBuffer(); } - buffer.put((byte) (0xf0 | ((uc >> 18)))); + buffer.put((byte) (0xf0 | (uc >> 18))); if (!buffer.hasRemaining()) { buffer = nextByteBuffer(); } @@ -249,7 +249,7 @@ public class JsonByteBufferWriter extends JsonWriter { if (!buffer.hasRemaining()) { buffer = nextByteBuffer(); } - buffer.put((byte) (0xe0 | ((c >> 12)))); + buffer.put((byte) (0xe0 | (c >> 12))); if (!buffer.hasRemaining()) { buffer = nextByteBuffer(); } @@ -476,287 +476,6 @@ public class JsonByteBufferWriter extends JsonWriter { } } - @Override - public void writeLastFieldShortValue(final byte[] fieldBytes, final char[] fieldChars, final short value) { - byte[] bs1 = fieldBytes; - byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value)); - int expandsize = expand(bs1.length + bs2.length + 1); - if (expandsize == 0) { // 只需要一个buffer - final ByteBuffer buffer = this.buffers[currBufIndex]; - buffer.put(bs1); - buffer.put(bs2); - buffer.put((byte) '}'); - } else { - ByteBuffer buffer = this.buffers[currBufIndex]; - for (byte b : bs1) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - for (byte b : bs2) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '}'); - } - } - } - - @Override - public void writeLastFieldIntValue(final byte[] fieldBytes, final char[] fieldChars, final int value) { - byte[] bs1 = fieldBytes; - byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value)); - int expandsize = expand(bs1.length + bs2.length + 1); - if (expandsize == 0) { // 只需要一个buffer - final ByteBuffer buffer = this.buffers[currBufIndex]; - buffer.put(bs1); - buffer.put(bs2); - buffer.put((byte) '}'); - } else { - ByteBuffer buffer = this.buffers[currBufIndex]; - for (byte b : bs1) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - for (byte b : bs2) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '}'); - } - } - } - - @Override - public void writeLastFieldLongValue(final byte[] fieldBytes, final char[] fieldChars, final long value) { - byte[] bs1 = fieldBytes; - byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value)); - int expandsize = expand(bs1.length + bs2.length + 1); - if (expandsize == 0) { // 只需要一个buffer - final ByteBuffer buffer = this.buffers[currBufIndex]; - buffer.put(bs1); - buffer.put(bs2); - buffer.put((byte) '}'); - } else { - ByteBuffer buffer = this.buffers[currBufIndex]; - for (byte b : bs1) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - for (byte b : bs2) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '}'); - } - } - } - - @Override - public void writeLastFieldLatin1Value(final byte[] fieldBytes, final char[] fieldChars, final String value) { - if (value == null && nullable()) { - writeTo(fieldBytes); - writeNull(); - writeTo('}'); - return; - } - if (value == null || (tiny() && value.isEmpty())) { - expand(1); - this.buffers[currBufIndex].put((byte) '}'); - } else { - byte[] bs1 = fieldBytes; - byte[] bs2 = Utility.latin1ByteArray(value); - int expandsize = expand(bs1.length + bs2.length + 3); - if (expandsize == 0) { // 只需要一个buffer - final ByteBuffer buffer = this.buffers[currBufIndex]; - buffer.put(bs1); - buffer.put((byte) '"'); - buffer.put(bs2); - buffer.put((byte) '"'); - buffer.put((byte) '}'); - } else { - ByteBuffer buffer = this.buffers[currBufIndex]; - for (byte b : bs1) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '"'); - } - for (byte b : bs2) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '"'); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '}'); - } - } - } - } - - @Override // firstFieldBytes 必须带{开头 - public void writeObjectByOnlyOneLatin1FieldValue( - final byte[] firstFieldBytes, final char[] firstFieldChars, final String value) { - if (value == null && nullable()) { - writeTo('{'); - writeTo(firstFieldBytes); - writeNull(); - writeTo('}'); - return; - } - if (value == null || (tiny() && value.isEmpty())) { - int expandsize = expand(2); - if (expandsize == 0) { // 只需要一个buffer - ByteBuffer bb = this.buffers[currBufIndex]; - bb.put((byte) '{'); - bb.put((byte) '}'); - } else { - ByteBuffer bb = this.buffers[currBufIndex]; - bb.put((byte) '{'); - bb = nextByteBuffer(); - bb.put((byte) '}'); - } - } else { - byte[] bs1 = firstFieldBytes; - byte[] bs2 = Utility.latin1ByteArray(value); - int expandsize = expand(bs1.length + bs2.length + 3); - if (expandsize == 0) { // 只需要一个buffer - final ByteBuffer buffer = this.buffers[currBufIndex]; - buffer.put(bs1); - buffer.put((byte) '"'); - buffer.put(bs2); - buffer.put((byte) '"'); - buffer.put((byte) '}'); - } else { - ByteBuffer buffer = this.buffers[currBufIndex]; - for (byte b : bs1) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '"'); - } - for (byte b : bs2) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '"'); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '}'); - } - } - } - } - - @Override // firstFieldBytes 必须带{开头, lastFieldBytes必须,开头 - public void writeObjectByOnlyTwoIntFieldValue( - final byte[] firstFieldBytes, - final char[] firstFieldChars, - final int value1, - final byte[] lastFieldBytes, - final char[] lastFieldChars, - final int value2) { - byte[] bs1 = firstFieldBytes; - byte[] bs2 = Utility.latin1ByteArray(String.valueOf(value1)); - byte[] bs3 = lastFieldBytes; - byte[] bs4 = Utility.latin1ByteArray(String.valueOf(value2)); - int expandsize = expand(bs1.length + bs2.length + bs3.length + bs4.length + 1); - if (expandsize == 0) { // 只需要一个buffer - final ByteBuffer buffer = this.buffers[currBufIndex]; - buffer.put(bs1); - buffer.put(bs2); - buffer.put(bs3); - buffer.put(bs4); - buffer.put((byte) '}'); - } else { - ByteBuffer buffer = this.buffers[currBufIndex]; - for (byte b : bs1) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - for (byte b : bs2) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - for (byte b : bs3) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - for (byte b : bs4) { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put(b); - } - { - if (!buffer.hasRemaining()) { - buffer = nextByteBuffer(); - } - buffer.put((byte) '}'); - } - } - } - @Override public void writeBoolean(boolean value) { writeTo(value ? CHARS_TUREVALUE : CHARS_FALSEVALUE); @@ -774,11 +493,6 @@ public class JsonByteBufferWriter extends JsonWriter { @Override public void writeString(String value) { - writeString(true, value); - } - - @Override - public void writeString(final boolean quote, String value) { if (value == null) { writeNull(); return; @@ -808,7 +522,7 @@ public class JsonByteBufferWriter extends JsonWriter { } } if (len == chs.length) { - writeTo(-1, quote, chs, 0, len); + writeTo(-1, true, chs, 0, len); return; } int expandsize = -1; @@ -817,9 +531,7 @@ public class JsonByteBufferWriter extends JsonWriter { expandsize = expand(byteLength); if (expandsize == 0) { // 只需要一个buffer final ByteBuffer buffer = this.buffers[currBufIndex]; - if (quote) { - buffer.put((byte) '"'); - } + buffer.put((byte) '"'); for (int i = 0; i < chs.length; i++) { char c = chs[i]; switch (c) { @@ -859,9 +571,7 @@ public class JsonByteBufferWriter extends JsonWriter { break; } } - if (quote) { - buffer.put((byte) '"'); - } + buffer.put((byte) '"'); return; } } @@ -889,7 +599,7 @@ public class JsonByteBufferWriter extends JsonWriter { } } char[] cs = Utility.charArray(sb); - writeTo(expandsize, quote, cs, 0, sb.length()); + writeTo(expandsize, true, cs, 0, sb.length()); } @Override diff --git a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java index 6820d528e..44fe789cd 100644 --- a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java @@ -250,157 +250,6 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { src[count++] = BYTE_DQUOTE; } - @Override - public void writeLastFieldShortValue(final byte[] fieldBytes, final char[] fieldChars, final short value) { - byte[] bs1 = fieldBytes; - byte[] bs2 = (value >= 0 && value < TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES[value] - : ((value < 0 && value > -TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES2[-value] - : Utility.latin1ByteArray(String.valueOf(value))); - int len1 = bs1.length; - int len2 = bs2.length; - byte[] src = expand(len1 + len2 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - src[count++] = BYTE_RBRACE; - } - - @Override - public void writeLastFieldIntValue(final byte[] fieldBytes, final char[] fieldChars, final int value) { - byte[] bs1 = fieldBytes; - byte[] bs2 = (value >= 0 && value < TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES[value] - : ((value < 0 && value > -TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES2[-value] - : Utility.latin1ByteArray(String.valueOf(value))); - int len1 = bs1.length; - int len2 = bs2.length; - byte[] src = expand(len1 + len2 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - src[count++] = BYTE_RBRACE; - } - - @Override - public void writeLastFieldLongValue(final byte[] fieldBytes, final char[] fieldChars, final long value) { - byte[] bs1 = fieldBytes; - byte[] bs2 = (value >= 0 && value < TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES[(int) value] - : ((value < 0 && value > -TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES2[(int) -value] - : Utility.latin1ByteArray(String.valueOf(value))); - int len1 = bs1.length; - int len2 = bs2.length; - byte[] src = expand(len1 + len2 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - src[count++] = BYTE_RBRACE; - } - - @Override - public void writeLastFieldLatin1Value(final byte[] fieldBytes, final char[] fieldChars, final String value) { - if (value == null && nullable()) { - writeTo(fieldBytes); - writeNull(); - writeTo(BYTE_RBRACE); - return; - } - if (value == null || (tiny() && value.isEmpty())) { - expand(1); - content[count++] = BYTE_RBRACE; - } else { - byte[] bs1 = fieldBytes; - byte[] bs2 = Utility.latin1ByteArray(value); - int len1 = bs1.length; - int len2 = bs2.length; - byte[] src = expand(len1 + len2 + 3); - int c = count; - System.arraycopy(bs1, 0, src, c, len1); - c += len1; - src[c++] = BYTE_DQUOTE; - System.arraycopy(bs2, 0, src, c, len2); - c += len2; - src[c++] = BYTE_DQUOTE; - src[c++] = BYTE_RBRACE; - count = c; - } - } - - @Override // firstFieldBytes 必须带{开头 - public void writeObjectByOnlyOneLatin1FieldValue( - final byte[] firstFieldBytes, final char[] firstFieldChars, final String value) { - if (value == null && nullable()) { - writeTo(BYTE_LBRACE); - writeTo(firstFieldBytes); - writeNull(); - writeTo(BYTE_RBRACE); - return; - } - if (value == null || (tiny() && value.isEmpty())) { - expand(2); - content[count++] = BYTE_LBRACE; - content[count++] = BYTE_RBRACE; - } else { - byte[] bs1 = firstFieldBytes; - byte[] bs2 = Utility.latin1ByteArray(value); - int len1 = bs1.length; - int len2 = bs2.length; - byte[] src = expand(len1 + len2 + 3); - int c = count; - System.arraycopy(bs1, 0, src, c, len1); - c += len1; - src[c++] = BYTE_DQUOTE; - System.arraycopy(bs2, 0, src, c, len2); - c += len2; - src[c++] = BYTE_DQUOTE; - src[c++] = BYTE_RBRACE; - count = c; - } - } - - @Override // firstFieldBytes 必须带{开头, lastFieldBytes必须,开头 - public void writeObjectByOnlyTwoIntFieldValue( - final byte[] firstFieldBytes, - final char[] firstFieldChars, - final int value1, - final byte[] lastFieldBytes, - final char[] lastFieldChars, - final int value2) { - byte[] bs1 = firstFieldBytes; - byte[] bs2 = (value1 >= 0 && value1 < TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES[value1] - : ((value1 < 0 && value1 > -TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES2[-value1] - : Utility.latin1ByteArray(String.valueOf(value1))); - byte[] bs3 = lastFieldBytes; - byte[] bs4 = (value2 >= 0 && value2 < TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES[value2] - : ((value2 < 0 && value2 > -TENTHOUSAND_MAX) - ? TENTHOUSAND_BYTES2[-value2] - : Utility.latin1ByteArray(String.valueOf(value2))); - int len1 = bs1.length; - int len2 = bs2.length; - int len3 = bs3.length; - int len4 = bs4.length; - byte[] src = expand(len1 + len2 + len3 + len4 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - System.arraycopy(bs3, 0, src, count, len3); - count += len3; - System.arraycopy(bs4, 0, src, count, len4); - count += len4; - src[count++] = BYTE_RBRACE; - } - public JsonBytesWriter clear() { this.count = 0; return this; @@ -427,30 +276,23 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { @Override public void writeString(String value) { - writeString(true, value); - } - - @Override - public void writeString(final boolean quote, String value) { if (value == null) { writeNull(); return; } if (Utility.isLatin1(value)) { - writeEscapeLatinString(quote, Utility.latin1ByteArray(value)); + writeEscapeLatinString(Utility.latin1ByteArray(value)); return; } byte[] utf16s = Utility.utf16ByteArray(value); if (utf16s != null) { // JDK9+ - writeEscapeUTF16String(quote, utf16s); + writeEscapeUTF16String(utf16s); return; } int len = value.length(); byte[] bytes = expand(len * 4 + 2); int curr = count; - if (quote) { - bytes[curr++] = BYTE_DQUOTE; - } + bytes[curr++] = BYTE_DQUOTE; for (int i = 0; i < len; i++) { char ch = value.charAt(i); if (ch < 14) { @@ -499,20 +341,16 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { bytes[curr++] = (byte) (0x80 | (ch & 0x3f)); } } - if (quote) { - bytes[curr++] = BYTE_DQUOTE; - } + bytes[curr++] = BYTE_DQUOTE; count = curr; } // see java.lang.StringCoding.encodeUTF8_UTF16 方法 - private void writeEscapeUTF16String(final boolean quote, byte[] value) { + private void writeEscapeUTF16String(byte[] value) { int len = value.length; byte[] bytes = expand(len * 4 + 2); int curr = count; - if (quote) { - bytes[curr++] = BYTE_DQUOTE; - } + bytes[curr++] = BYTE_DQUOTE; byte[] src = value; int i = 0; while (i < len) { @@ -578,9 +416,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { } } } - if (quote) { - bytes[curr++] = BYTE_DQUOTE; - } + bytes[curr++] = BYTE_DQUOTE; count = curr; } @@ -594,12 +430,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { private static final int MIN_SUPPLEMENTARY_CODE_POINT_MORE = (MIN_SUPPLEMENTARY_CODE_POINT - (MIN_HIGH_SURROGATE << 10) - MIN_LOW_SURROGATE); - private void writeEscapeLatinString(final boolean quote, byte[] value) { + private void writeEscapeLatinString(byte[] value) { byte[] bytes = expand(value.length * 2 + 2); int curr = count; - if (quote) { - bytes[curr++] = BYTE_DQUOTE; - } + bytes[curr++] = BYTE_DQUOTE; for (byte b : value) { if (b == BYTE_DQUOTE) { bytes[curr++] = '\\'; @@ -630,9 +464,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { bytes[curr++] = b; } } - if (quote) { - bytes[curr++] = BYTE_DQUOTE; - } + bytes[curr++] = BYTE_DQUOTE; count = curr; } diff --git a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java index e9b15bdda..a2bf78191 100644 --- a/src/main/java/org/redkale/convert/json/JsonCharsWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonCharsWriter.java @@ -5,8 +5,6 @@ package org.redkale.convert.json; import static org.redkale.convert.json.JsonWriter.BYTE_DQUOTE; -import static org.redkale.convert.json.JsonWriter.BYTE_LBRACE; -import static org.redkale.convert.json.JsonWriter.BYTE_RBRACE; import static org.redkale.convert.json.JsonWriter.DEFAULT_SIZE; import static org.redkale.convert.json.JsonWriter.DigitOnes; import static org.redkale.convert.json.JsonWriter.DigitTens; @@ -206,149 +204,6 @@ public class JsonCharsWriter extends JsonWriter { src[count++] = BYTE_DQUOTE; } - @Override - public void writeLastFieldShortValue(final byte[] fieldBytes, final char[] fieldChars, final short value) { - char[] bs1 = fieldChars; - char[] bs2 = (value >= 0 && value < TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS[value] - : ((value < 0 && value > -TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS2[-value] - : String.valueOf(value).toCharArray()); - int len1 = bs1.length; - int len2 = bs2.length; - char[] src = expand(len1 + len2 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - src[count++] = BYTE_RBRACE; - } - - @Override - public void writeLastFieldIntValue(final byte[] fieldBytes, final char[] fieldChars, final int value) { - char[] bs1 = fieldChars; - char[] bs2 = (value >= 0 && value < TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS[value] - : ((value < 0 && value > -TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS2[-value] - : String.valueOf(value).toCharArray()); - int len1 = bs1.length; - int len2 = bs2.length; - char[] src = expand(len1 + len2 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - src[count++] = BYTE_RBRACE; - } - - @Override - public void writeLastFieldLongValue(final byte[] fieldBytes, final char[] fieldChars, final long value) { - char[] bs1 = fieldChars; - char[] bs2 = (value >= 0 && value < TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS[(int) value] - : ((value < 0 && value > -TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS2[(int) -value] - : String.valueOf(value).toCharArray()); - int len1 = bs1.length; - int len2 = bs2.length; - char[] src = expand(len1 + len2 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - src[count++] = BYTE_RBRACE; - } - - @Override - public void writeLastFieldLatin1Value(final byte[] fieldBytes, final char[] fieldChars, final String value) { - if (value == null && nullable()) { - writeTo(fieldChars); - writeNull(); - writeTo(BYTE_RBRACE); - return; - } - if (value == null || (tiny() && value.isEmpty())) { - expand(1); - content[count++] = BYTE_RBRACE; - } else { - int len1 = fieldChars.length; - int len2 = value.length(); - char[] src = expand(len1 + len2 + 3); - System.arraycopy(fieldChars, 0, src, count, len1); - count += len1; - content[count++] = BYTE_DQUOTE; - value.getChars(0, len2, content, count); - count += len2; - content[count++] = BYTE_DQUOTE; - content[count++] = BYTE_RBRACE; - } - } - - @Override // firstFieldBytes 必须带{开头 - public void writeObjectByOnlyOneLatin1FieldValue( - byte[] firstFieldBytes, char[] firstFieldChars, final String value) { - if (value == null && nullable()) { - writeTo(BYTE_LBRACE); - writeTo(firstFieldChars); - writeNull(); - writeTo(BYTE_RBRACE); - return; - } - if (value == null || (tiny() && value.isEmpty())) { - expand(2); - content[count++] = BYTE_LBRACE; - content[count++] = BYTE_RBRACE; - } else { - int len1 = firstFieldChars.length; - int len2 = value.length(); - char[] src = expand(len1 + len2 + 3); - System.arraycopy(firstFieldChars, 0, src, count, len1); - count += len1; - content[count++] = BYTE_DQUOTE; - value.getChars(0, len2, content, count); - count += len2; - content[count++] = BYTE_DQUOTE; - content[count++] = BYTE_RBRACE; - } - } - - @Override // firstFieldBytes 必须带{开头, lastFieldBytes必须,开头 - public void writeObjectByOnlyTwoIntFieldValue( - final byte[] firstFieldBytes, - final char[] firstFieldChars, - final int value1, - final byte[] lastFieldBytes, - final char[] lastFieldChars, - final int value2) { - char[] bs1 = firstFieldChars; - char[] bs2 = (value1 >= 0 && value1 < TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS[value1] - : ((value1 < 0 && value1 > -TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS2[-value1] - : String.valueOf(value1).toCharArray()); - char[] bs3 = lastFieldChars; - char[] bs4 = (value2 >= 0 && value2 < TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS[value2] - : ((value2 < 0 && value2 > -TENTHOUSAND_MAX) - ? TENTHOUSAND_CHARS2[-value2] - : String.valueOf(value2).toCharArray()); - int len1 = bs1.length; - int len2 = bs2.length; - int len3 = bs3.length; - int len4 = bs4.length; - char[] src = expand(len1 + len2 + len3 + len4 + 1); - System.arraycopy(bs1, 0, src, count, len1); - count += len1; - System.arraycopy(bs2, 0, src, count, len2); - count += len2; - System.arraycopy(bs3, 0, src, count, len3); - count += len3; - System.arraycopy(bs4, 0, src, count, len4); - count += len4; - src[count++] = BYTE_RBRACE; - } - public byte[] toBytes() { return Utility.encodeUTF8(content, 0, count); } @@ -359,33 +214,26 @@ public class JsonCharsWriter extends JsonWriter { @Override public void writeString(String value) { - writeString(true, value); - } - - @Override - public void writeString(final boolean quote, String value) { if (value == null) { writeNull(); return; } final String str = value; if (Utility.isLatin1(str)) { - writeEscapeLatinString(quote, Utility.latin1ByteArray(str)); + writeEscapeLatinString(Utility.latin1ByteArray(str)); return; } if (false) { byte[] utf16s = Utility.utf16ByteArray(value); if (utf16s != null) { // JDK9+ - writeEscapeUTF16String(quote, utf16s); + writeEscapeUTF16String(utf16s); return; } } final int len = str.length(); char[] chars = expand(len * 2 + 2); int curr = count; - if (quote) { - chars[curr++] = BYTE_DQUOTE; - } + chars[curr++] = BYTE_DQUOTE; for (int i = 0; i < len; i++) { char ch = str.charAt(i); if (ch < 14) { @@ -421,20 +269,16 @@ public class JsonCharsWriter extends JsonWriter { chars[curr++] = ch; } } - if (quote) { - chars[curr++] = BYTE_DQUOTE; - } + chars[curr++] = BYTE_DQUOTE; count = curr; } - private void writeEscapeUTF16String(final boolean quote, byte[] value) { + private void writeEscapeUTF16String(byte[] value) { byte[] bytes = value; int len = bytes.length; char[] chars = expand(len + 2); int curr = count; - if (quote) { - chars[curr++] = BYTE_DQUOTE; - } + chars[curr++] = BYTE_DQUOTE; byte b1, b2; for (int i = 0; i < len; i += 2) { b1 = bytes[i]; @@ -473,18 +317,14 @@ public class JsonCharsWriter extends JsonWriter { chars[curr++] = ch; } } - if (quote) { - chars[curr++] = BYTE_DQUOTE; - } + chars[curr++] = BYTE_DQUOTE; count = curr; } - private void writeEscapeLatinString(final boolean quote, byte[] value) { + private void writeEscapeLatinString(byte[] value) { char[] chars = expand(value.length * 2 + 2); int curr = count; - if (quote) { - chars[curr++] = BYTE_DQUOTE; - } + chars[curr++] = BYTE_DQUOTE; for (byte b : value) { if (b == BYTE_DQUOTE) { chars[curr++] = '\\'; @@ -515,9 +355,7 @@ public class JsonCharsWriter extends JsonWriter { chars[curr++] = (char) b; } } - if (quote) { - chars[curr++] = BYTE_DQUOTE; - } + chars[curr++] = BYTE_DQUOTE; count = curr; } diff --git a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java index db274bd4b..85b238b08 100644 --- a/src/main/java/org/redkale/convert/json/JsonDynEncoder.java +++ b/src/main/java/org/redkale/convert/json/JsonDynEncoder.java @@ -117,50 +117,22 @@ public abstract class JsonDynEncoder extends ObjectEncoder { null); final int membersSize = elements.size(); - boolean onlyTwoIntFieldObjectFlag = false; // 只包含两个int字段 - boolean onlyOneLatin1FieldObjectFlag = false; // 只包含一个Latin1 String字段 - boolean onlyShotIntLongLatin1MoreFieldObjectFlag = true; - int intFieldCount = 0; for (AccessibleObject element : elements) { final String fieldName = factory.readConvertFieldName(clazz, element); fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FieldBytes", "[B", null, null); fv.visitEnd(); fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "CommaFieldBytes", "[B", null, null); fv.visitEnd(); - fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FirstFieldBytes", "[B", null, null); - fv.visitEnd(); fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FieldChars", "[C", null, null); fv.visitEnd(); fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "CommaFieldChars", "[C", null, null); fv.visitEnd(); - fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FirstFieldChars", "[C", null, null); - fv.visitEnd(); final Class fieldType = readGetSetFieldType(element); if (fieldType != String.class && !fieldType.isPrimitive()) { fv = cw.visitField(ACC_PROTECTED, fieldName + "Encoder", encodeableDesc, null, null); fv.visitEnd(); } - if (fieldType == int.class) { - intFieldCount++; - } - if (fieldType == String.class && membersSize == 1 && isConvertStandardString(factory, element)) { - onlyOneLatin1FieldObjectFlag = true; - } else if (fieldType != short.class - && fieldType != int.class - && fieldType != long.class - && !(fieldType == String.class && isConvertStandardString(factory, element))) { - onlyShotIntLongLatin1MoreFieldObjectFlag = false; - } } - if (intFieldCount == 2 && intFieldCount == membersSize) { - onlyTwoIntFieldObjectFlag = true; - } - if (onlyShotIntLongLatin1MoreFieldObjectFlag && membersSize < 2) { - onlyShotIntLongLatin1MoreFieldObjectFlag = false; // 字段个数必须大于1 - } - onlyTwoIntFieldObjectFlag = false; // 废弃此特性 - onlyOneLatin1FieldObjectFlag = false; // 废弃此特性 - onlyShotIntLongLatin1MoreFieldObjectFlag = false; // 废弃此特性 { // 构造函数 mv = (cw.visitMethod( ACC_PUBLIC, "", "(" + jsonfactoryDesc + typeDesc + objEncoderDesc + ")V", null, null)); @@ -190,11 +162,6 @@ public abstract class JsonDynEncoder extends ObjectEncoder { mv.visitLdcInsn(",\"" + fieldName + "\":"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "getBytes", "()[B", false); mv.visitFieldInsn(PUTFIELD, newDynName, fieldName + "CommaFieldBytes", "[B"); - // xxxFirstFieldBytes - mv.visitVarInsn(ALOAD, 0); - mv.visitLdcInsn("{\"" + fieldName + "\":"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "getBytes", "()[B", false); - mv.visitFieldInsn(PUTFIELD, newDynName, fieldName + "FirstFieldBytes", "[B"); // xxxFieldChars mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn("\"" + fieldName + "\":"); @@ -205,11 +172,6 @@ public abstract class JsonDynEncoder extends ObjectEncoder { mv.visitLdcInsn(",\"" + fieldName + "\":"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toCharArray", "()[C", false); mv.visitFieldInsn(PUTFIELD, newDynName, fieldName + "CommaFieldChars", "[C"); - // xxxFirstFieldChars - mv.visitVarInsn(ALOAD, 0); - mv.visitLdcInsn("{\"" + fieldName + "\":"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toCharArray", "()[C", false); - mv.visitFieldInsn(PUTFIELD, newDynName, fieldName + "FirstFieldChars", "[C"); } mv.visitInsn(RETURN); Label label2 = new Label(); @@ -264,176 +226,9 @@ public abstract class JsonDynEncoder extends ObjectEncoder { final boolean tiny = ConvertFactory.checkTinyFeature(factory.getFeatures()); final boolean nullable = ConvertFactory.checkNullableFeature(factory.getFeatures()); final Class firstType = readGetSetFieldType(elements.get(0)); - final boolean mustHadComma = firstType.isPrimitive() - && (firstType != boolean.class || !tiny || nullable); // byte/short/char/int/float/long/double - - if (onlyOneLatin1FieldObjectFlag) { - // out.writeObjectByOnlyOneLatin1FieldValue(messageFirstFieldBytes, value.getMessage());elementIndex++; - elementIndex++; - AccessibleObject element = elements.get(elementIndex); - final String fieldName = factory.readConvertFieldName(clazz, element); - final Class fieldType = readGetSetFieldType(element); - - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, fieldName + "FirstFieldBytes", "[B"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, fieldName + "FirstFieldChars", "[C"); - - mv.visitVarInsn(ALOAD, 2); // String message = value.getMessage(); 加载 value - if (element instanceof Field) { - mv.visitFieldInsn( - GETFIELD, - valtypeName, - ((Field) element).getName(), - org.redkale.asm.Type.getDescriptor(fieldType)); - } else { - mv.visitMethodInsn( - INVOKEVIRTUAL, - valtypeName, - ((Method) element).getName(), - "()" + org.redkale.asm.Type.getDescriptor(fieldType), - false); - } - mv.visitMethodInsn( - INVOKEVIRTUAL, - writerName, - "writeObjectByOnlyOneLatin1FieldValue", - "([B[CLjava/lang/String;)V", - false); - maxLocals++; - } else if (onlyTwoIntFieldObjectFlag) { - elementIndex++; - AccessibleObject element1 = elements.get(elementIndex); - final String fieldName1 = factory.readConvertFieldName(clazz, element1); - final Class fieldType1 = readGetSetFieldType(element1); - - elementIndex++; - AccessibleObject element2 = elements.get(elementIndex); - final String fieldName2 = factory.readConvertFieldName(clazz, element2); - final Class fieldtype2 = readGetSetFieldType(element2); - - mv.visitVarInsn(ALOAD, 1); - - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, fieldName1 + "FirstFieldBytes", "[B"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, fieldName1 + "FirstFieldChars", "[C"); - - mv.visitVarInsn(ALOAD, 2); // String message = value.getMessage(); 加载 value - if (element1 instanceof Field) { - mv.visitFieldInsn( - GETFIELD, - valtypeName, - ((Field) element1).getName(), - org.redkale.asm.Type.getDescriptor(fieldType1)); - } else { - mv.visitMethodInsn( - INVOKEVIRTUAL, - valtypeName, - ((Method) element1).getName(), - "()" + org.redkale.asm.Type.getDescriptor(fieldType1), - false); - } - maxLocals++; - - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, fieldName2 + "CommaFieldBytes", "[B"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, newDynName, fieldName2 + "CommaFieldChars", "[C"); - - mv.visitVarInsn(ALOAD, 2); // String message = value.getMessage(); 加载 value - if (element2 instanceof Field) { - mv.visitFieldInsn( - GETFIELD, - valtypeName, - ((Field) element2).getName(), - org.redkale.asm.Type.getDescriptor(fieldtype2)); - } else { - mv.visitMethodInsn( - INVOKEVIRTUAL, - valtypeName, - ((Method) element2).getName(), - "()" + org.redkale.asm.Type.getDescriptor(fieldtype2), - false); - } - maxLocals++; - - mv.visitMethodInsn( - INVOKEVIRTUAL, writerName, "writeObjectByOnlyTwoIntFieldValue", "([B[CI[B[CI)V", false); - - } else if (onlyShotIntLongLatin1MoreFieldObjectFlag && mustHadComma) { - for (AccessibleObject element : elements) { - elementIndex++; - final String fieldName = factory.readConvertFieldName(clazz, element); - final Class fieldType = readGetSetFieldType(element); - - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn( - GETFIELD, - newDynName, - fieldName + (elementIndex == 0 ? "FirstFieldBytes" : "CommaFieldBytes"), - "[B"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn( - GETFIELD, - newDynName, - fieldName + (elementIndex == 0 ? "FirstFieldChars" : "CommaFieldChars"), - "[C"); - - mv.visitVarInsn(ALOAD, 2); // String message = value.getMessage(); 加载 value - if (element instanceof Field) { - mv.visitFieldInsn( - GETFIELD, - valtypeName, - ((Field) element).getName(), - org.redkale.asm.Type.getDescriptor(fieldType)); - } else { - mv.visitMethodInsn( - INVOKEVIRTUAL, - valtypeName, - ((Method) element).getName(), - "()" + org.redkale.asm.Type.getDescriptor(fieldType), - false); - } - if (fieldType == short.class) { - mv.visitMethodInsn( - INVOKEVIRTUAL, - writerName, - elementIndex + 1 == membersSize ? "writeLastFieldShortValue" : "writeFieldShortValue", - "([B[CS)V", - false); - } else if (fieldType == int.class) { - mv.visitMethodInsn( - INVOKEVIRTUAL, - writerName, - elementIndex + 1 == membersSize ? "writeLastFieldIntValue" : "writeFieldIntValue", - "([B[CI)V", - false); - } else if (fieldType == long.class) { - mv.visitMethodInsn( - INVOKEVIRTUAL, - writerName, - elementIndex + 1 == membersSize ? "writeLastFieldLongValue" : "writeFieldLongValue", - "([B[CJ)V", - false); - } else { - mv.visitMethodInsn( - INVOKEVIRTUAL, - writerName, - elementIndex + 1 == membersSize ? "writeLastFieldLatin1Value" : "writeFieldLatin1Value", - "([B[CLjava/lang/String;)V", - false); - } - - if (fieldType == long.class || fieldType == double.class) { - maxLocals += 2; - } else { - maxLocals++; - } - } - } else { + final boolean mustHadComma = (firstType.isPrimitive() && (firstType != boolean.class || !tiny || nullable)) + || membersSize == 1; // byte/short/char/int/float/long/double + { { // out.writeTo('{'); mv.visitVarInsn(ALOAD, 1); mv.visitIntInsn(BIPUSH, '{'); @@ -634,10 +429,9 @@ public abstract class JsonDynEncoder extends ObjectEncoder { INVOKEVIRTUAL, writerName, "writeString", "(Ljava/lang/String;)V", false); } else { mv.visitVarInsn(ALOAD, 1); - mv.visitInsn(ICONST_1); mv.visitVarInsn(loadid, maxLocals); mv.visitMethodInsn( - INVOKEVIRTUAL, writerName, "writeLatin1To", "(ZLjava/lang/String;)V", false); + INVOKEVIRTUAL, writerName, "writeStandardString", "(Ljava/lang/String;)V", false); } } else { // int[],Boolean[],String[] mv.visitVarInsn(ALOAD, 0); diff --git a/src/main/java/org/redkale/convert/json/JsonWriter.java b/src/main/java/org/redkale/convert/json/JsonWriter.java index bbb515a78..0ef4a8e37 100644 --- a/src/main/java/org/redkale/convert/json/JsonWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonWriter.java @@ -83,51 +83,14 @@ public abstract class JsonWriter extends Writer { } } - @ClassDepends public abstract void writeFieldShortValue(final byte[] fieldBytes, final char[] fieldChars, final short value); - @ClassDepends public abstract void writeFieldIntValue(final byte[] fieldBytes, final char[] fieldChars, final int value); - @ClassDepends public abstract void writeFieldLongValue(final byte[] fieldBytes, final char[] fieldChars, final long value); - @ClassDepends public abstract void writeFieldLatin1Value(final byte[] fieldBytes, final char[] fieldChars, final String value); - @ClassDepends - @Deprecated(since = "2.8.0") - public abstract void writeLastFieldShortValue(final byte[] fieldBytes, final char[] fieldChars, final short value); - - @ClassDepends - @Deprecated(since = "2.8.0") - public abstract void writeLastFieldIntValue(final byte[] fieldBytes, final char[] fieldChars, final int value); - - @ClassDepends - @Deprecated(since = "2.8.0") - public abstract void writeLastFieldLongValue(final byte[] fieldBytes, final char[] fieldChars, final long value); - - @ClassDepends - @Deprecated(since = "2.8.0") - public abstract void writeLastFieldLatin1Value(final byte[] fieldBytes, final char[] fieldChars, String value); - - // firstFieldBytes 必须带{开头 - @ClassDepends - @Deprecated(since = "2.8.0") - public abstract void writeObjectByOnlyOneLatin1FieldValue( - final byte[] firstFieldBytes, final char[] firstFieldChars, final String value); - - // firstFieldBytes 必须带{开头, lastFieldBytes必须,开头 - @ClassDepends - @Deprecated(since = "2.8.0") - public abstract void writeObjectByOnlyTwoIntFieldValue( - final byte[] firstFieldBytes, - final char[] firstFieldChars, - final int value1, - final byte[] lastFieldBytes, - final char[] lastFieldChars, - final int value2); - @Override @ClassDepends public abstract void writeBoolean(boolean value); @@ -140,12 +103,16 @@ public abstract class JsonWriter extends Writer { @ClassDepends public abstract void writeLong(long value); - public abstract void writeString(final boolean quote, String value); - @Override @ClassDepends public abstract void writeString(String value); + @Override + @ClassDepends + public final void writeStandardString(String value) { + writeLatin1To(true, value); + } + @Override // 只容许JsonBytesWriter重写此方法 public void writeField(EnMember member, String fieldName, Type fieldType, int fieldPos) { if (this.comma) { @@ -164,21 +131,11 @@ public abstract class JsonWriter extends Writer { } } - @Override - public final void writeStandardString(String value) { - writeLatin1To(true, value); - } - // ---------------------------------------------------------------------------------------------- public final void writeTo(final char... chs) { // 只能是 0 - 127 的字符 writeTo(chs, 0, chs.length); } - @Override - public final void writeByte(byte value) { - writeInt(value); - } - public final void writeTo(final byte[] chs) { // 只能是 0 - 127 的字符 writeTo(chs, 0, chs.length); } @@ -201,6 +158,11 @@ public abstract class JsonWriter extends Writer { writeArrayE(); } + @Override + public final void writeByte(byte value) { + writeInt(value); + } + @Override public final void writeChar(char value) { writeInt(value);