json优化
This commit is contained in:
@@ -21,4 +21,6 @@ import static java.lang.annotation.RetentionPolicy.*;
|
|||||||
public @interface ClassDepends {
|
public @interface ClassDepends {
|
||||||
|
|
||||||
Class[] value() default {};
|
Class[] value() default {};
|
||||||
|
|
||||||
|
String comment() default "";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
}
|
}
|
||||||
buffer.put((byte) (0xf0 | ((uc >> 18))));
|
buffer.put((byte) (0xf0 | (uc >> 18)));
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
}
|
}
|
||||||
@@ -249,7 +249,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
buffer = nextByteBuffer();
|
||||||
}
|
}
|
||||||
buffer.put((byte) (0xe0 | ((c >> 12))));
|
buffer.put((byte) (0xe0 | (c >> 12)));
|
||||||
if (!buffer.hasRemaining()) {
|
if (!buffer.hasRemaining()) {
|
||||||
buffer = nextByteBuffer();
|
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
|
@Override
|
||||||
public void writeBoolean(boolean value) {
|
public void writeBoolean(boolean value) {
|
||||||
writeTo(value ? CHARS_TUREVALUE : CHARS_FALSEVALUE);
|
writeTo(value ? CHARS_TUREVALUE : CHARS_FALSEVALUE);
|
||||||
@@ -774,11 +493,6 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeString(String value) {
|
public void writeString(String value) {
|
||||||
writeString(true, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeString(final boolean quote, String value) {
|
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
writeNull();
|
writeNull();
|
||||||
return;
|
return;
|
||||||
@@ -808,7 +522,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (len == chs.length) {
|
if (len == chs.length) {
|
||||||
writeTo(-1, quote, chs, 0, len);
|
writeTo(-1, true, chs, 0, len);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int expandsize = -1;
|
int expandsize = -1;
|
||||||
@@ -817,9 +531,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
expandsize = expand(byteLength);
|
expandsize = expand(byteLength);
|
||||||
if (expandsize == 0) { // 只需要一个buffer
|
if (expandsize == 0) { // 只需要一个buffer
|
||||||
final ByteBuffer buffer = this.buffers[currBufIndex];
|
final ByteBuffer buffer = this.buffers[currBufIndex];
|
||||||
if (quote) {
|
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
}
|
|
||||||
for (int i = 0; i < chs.length; i++) {
|
for (int i = 0; i < chs.length; i++) {
|
||||||
char c = chs[i];
|
char c = chs[i];
|
||||||
switch (c) {
|
switch (c) {
|
||||||
@@ -859,9 +571,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quote) {
|
|
||||||
buffer.put((byte) '"');
|
buffer.put((byte) '"');
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -889,7 +599,7 @@ public class JsonByteBufferWriter extends JsonWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
char[] cs = Utility.charArray(sb);
|
char[] cs = Utility.charArray(sb);
|
||||||
writeTo(expandsize, quote, cs, 0, sb.length());
|
writeTo(expandsize, true, cs, 0, sb.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -250,157 +250,6 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
src[count++] = BYTE_DQUOTE;
|
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() {
|
public JsonBytesWriter clear() {
|
||||||
this.count = 0;
|
this.count = 0;
|
||||||
return this;
|
return this;
|
||||||
@@ -427,30 +276,23 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeString(String value) {
|
public void writeString(String value) {
|
||||||
writeString(true, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeString(final boolean quote, String value) {
|
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
writeNull();
|
writeNull();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Utility.isLatin1(value)) {
|
if (Utility.isLatin1(value)) {
|
||||||
writeEscapeLatinString(quote, Utility.latin1ByteArray(value));
|
writeEscapeLatinString(Utility.latin1ByteArray(value));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
byte[] utf16s = Utility.utf16ByteArray(value);
|
byte[] utf16s = Utility.utf16ByteArray(value);
|
||||||
if (utf16s != null) { // JDK9+
|
if (utf16s != null) { // JDK9+
|
||||||
writeEscapeUTF16String(quote, utf16s);
|
writeEscapeUTF16String(utf16s);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int len = value.length();
|
int len = value.length();
|
||||||
byte[] bytes = expand(len * 4 + 2);
|
byte[] bytes = expand(len * 4 + 2);
|
||||||
int curr = count;
|
int curr = count;
|
||||||
if (quote) {
|
|
||||||
bytes[curr++] = BYTE_DQUOTE;
|
bytes[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
char ch = value.charAt(i);
|
char ch = value.charAt(i);
|
||||||
if (ch < 14) {
|
if (ch < 14) {
|
||||||
@@ -499,20 +341,16 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
bytes[curr++] = (byte) (0x80 | (ch & 0x3f));
|
bytes[curr++] = (byte) (0x80 | (ch & 0x3f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quote) {
|
|
||||||
bytes[curr++] = BYTE_DQUOTE;
|
bytes[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
count = curr;
|
count = curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// see java.lang.StringCoding.encodeUTF8_UTF16 方法
|
// see java.lang.StringCoding.encodeUTF8_UTF16 方法
|
||||||
private void writeEscapeUTF16String(final boolean quote, byte[] value) {
|
private void writeEscapeUTF16String(byte[] value) {
|
||||||
int len = value.length;
|
int len = value.length;
|
||||||
byte[] bytes = expand(len * 4 + 2);
|
byte[] bytes = expand(len * 4 + 2);
|
||||||
int curr = count;
|
int curr = count;
|
||||||
if (quote) {
|
|
||||||
bytes[curr++] = BYTE_DQUOTE;
|
bytes[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
byte[] src = value;
|
byte[] src = value;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < len) {
|
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;
|
count = curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -594,12 +430,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
private static final int MIN_SUPPLEMENTARY_CODE_POINT_MORE =
|
private static final int MIN_SUPPLEMENTARY_CODE_POINT_MORE =
|
||||||
(MIN_SUPPLEMENTARY_CODE_POINT - (MIN_HIGH_SURROGATE << 10) - MIN_LOW_SURROGATE);
|
(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);
|
byte[] bytes = expand(value.length * 2 + 2);
|
||||||
int curr = count;
|
int curr = count;
|
||||||
if (quote) {
|
|
||||||
bytes[curr++] = BYTE_DQUOTE;
|
bytes[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
for (byte b : value) {
|
for (byte b : value) {
|
||||||
if (b == BYTE_DQUOTE) {
|
if (b == BYTE_DQUOTE) {
|
||||||
bytes[curr++] = '\\';
|
bytes[curr++] = '\\';
|
||||||
@@ -630,9 +464,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
bytes[curr++] = b;
|
bytes[curr++] = b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quote) {
|
|
||||||
bytes[curr++] = BYTE_DQUOTE;
|
bytes[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
count = curr;
|
count = curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
package org.redkale.convert.json;
|
package org.redkale.convert.json;
|
||||||
|
|
||||||
import static org.redkale.convert.json.JsonWriter.BYTE_DQUOTE;
|
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.DEFAULT_SIZE;
|
||||||
import static org.redkale.convert.json.JsonWriter.DigitOnes;
|
import static org.redkale.convert.json.JsonWriter.DigitOnes;
|
||||||
import static org.redkale.convert.json.JsonWriter.DigitTens;
|
import static org.redkale.convert.json.JsonWriter.DigitTens;
|
||||||
@@ -206,149 +204,6 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
src[count++] = BYTE_DQUOTE;
|
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() {
|
public byte[] toBytes() {
|
||||||
return Utility.encodeUTF8(content, 0, count);
|
return Utility.encodeUTF8(content, 0, count);
|
||||||
}
|
}
|
||||||
@@ -359,33 +214,26 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeString(String value) {
|
public void writeString(String value) {
|
||||||
writeString(true, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeString(final boolean quote, String value) {
|
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
writeNull();
|
writeNull();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final String str = value;
|
final String str = value;
|
||||||
if (Utility.isLatin1(str)) {
|
if (Utility.isLatin1(str)) {
|
||||||
writeEscapeLatinString(quote, Utility.latin1ByteArray(str));
|
writeEscapeLatinString(Utility.latin1ByteArray(str));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (false) {
|
if (false) {
|
||||||
byte[] utf16s = Utility.utf16ByteArray(value);
|
byte[] utf16s = Utility.utf16ByteArray(value);
|
||||||
if (utf16s != null) { // JDK9+
|
if (utf16s != null) { // JDK9+
|
||||||
writeEscapeUTF16String(quote, utf16s);
|
writeEscapeUTF16String(utf16s);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final int len = str.length();
|
final int len = str.length();
|
||||||
char[] chars = expand(len * 2 + 2);
|
char[] chars = expand(len * 2 + 2);
|
||||||
int curr = count;
|
int curr = count;
|
||||||
if (quote) {
|
|
||||||
chars[curr++] = BYTE_DQUOTE;
|
chars[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
char ch = str.charAt(i);
|
char ch = str.charAt(i);
|
||||||
if (ch < 14) {
|
if (ch < 14) {
|
||||||
@@ -421,20 +269,16 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
chars[curr++] = ch;
|
chars[curr++] = ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quote) {
|
|
||||||
chars[curr++] = BYTE_DQUOTE;
|
chars[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
count = curr;
|
count = curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeEscapeUTF16String(final boolean quote, byte[] value) {
|
private void writeEscapeUTF16String(byte[] value) {
|
||||||
byte[] bytes = value;
|
byte[] bytes = value;
|
||||||
int len = bytes.length;
|
int len = bytes.length;
|
||||||
char[] chars = expand(len + 2);
|
char[] chars = expand(len + 2);
|
||||||
int curr = count;
|
int curr = count;
|
||||||
if (quote) {
|
|
||||||
chars[curr++] = BYTE_DQUOTE;
|
chars[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
byte b1, b2;
|
byte b1, b2;
|
||||||
for (int i = 0; i < len; i += 2) {
|
for (int i = 0; i < len; i += 2) {
|
||||||
b1 = bytes[i];
|
b1 = bytes[i];
|
||||||
@@ -473,18 +317,14 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
chars[curr++] = ch;
|
chars[curr++] = ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quote) {
|
|
||||||
chars[curr++] = BYTE_DQUOTE;
|
chars[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
count = curr;
|
count = curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeEscapeLatinString(final boolean quote, byte[] value) {
|
private void writeEscapeLatinString(byte[] value) {
|
||||||
char[] chars = expand(value.length * 2 + 2);
|
char[] chars = expand(value.length * 2 + 2);
|
||||||
int curr = count;
|
int curr = count;
|
||||||
if (quote) {
|
|
||||||
chars[curr++] = BYTE_DQUOTE;
|
chars[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
for (byte b : value) {
|
for (byte b : value) {
|
||||||
if (b == BYTE_DQUOTE) {
|
if (b == BYTE_DQUOTE) {
|
||||||
chars[curr++] = '\\';
|
chars[curr++] = '\\';
|
||||||
@@ -515,9 +355,7 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
chars[curr++] = (char) b;
|
chars[curr++] = (char) b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quote) {
|
|
||||||
chars[curr++] = BYTE_DQUOTE;
|
chars[curr++] = BYTE_DQUOTE;
|
||||||
}
|
|
||||||
count = curr;
|
count = curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -117,50 +117,22 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
|
|||||||
null);
|
null);
|
||||||
|
|
||||||
final int membersSize = elements.size();
|
final int membersSize = elements.size();
|
||||||
boolean onlyTwoIntFieldObjectFlag = false; // 只包含两个int字段
|
|
||||||
boolean onlyOneLatin1FieldObjectFlag = false; // 只包含一个Latin1 String字段
|
|
||||||
boolean onlyShotIntLongLatin1MoreFieldObjectFlag = true;
|
|
||||||
int intFieldCount = 0;
|
|
||||||
for (AccessibleObject element : elements) {
|
for (AccessibleObject element : elements) {
|
||||||
final String fieldName = factory.readConvertFieldName(clazz, element);
|
final String fieldName = factory.readConvertFieldName(clazz, element);
|
||||||
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FieldBytes", "[B", null, null);
|
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FieldBytes", "[B", null, null);
|
||||||
fv.visitEnd();
|
fv.visitEnd();
|
||||||
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "CommaFieldBytes", "[B", null, null);
|
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "CommaFieldBytes", "[B", null, null);
|
||||||
fv.visitEnd();
|
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 = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FieldChars", "[C", null, null);
|
||||||
fv.visitEnd();
|
fv.visitEnd();
|
||||||
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "CommaFieldChars", "[C", null, null);
|
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "CommaFieldChars", "[C", null, null);
|
||||||
fv.visitEnd();
|
fv.visitEnd();
|
||||||
fv = cw.visitField(ACC_PROTECTED + ACC_FINAL, fieldName + "FirstFieldChars", "[C", null, null);
|
|
||||||
fv.visitEnd();
|
|
||||||
final Class fieldType = readGetSetFieldType(element);
|
final Class fieldType = readGetSetFieldType(element);
|
||||||
if (fieldType != String.class && !fieldType.isPrimitive()) {
|
if (fieldType != String.class && !fieldType.isPrimitive()) {
|
||||||
fv = cw.visitField(ACC_PROTECTED, fieldName + "Encoder", encodeableDesc, null, null);
|
fv = cw.visitField(ACC_PROTECTED, fieldName + "Encoder", encodeableDesc, null, null);
|
||||||
fv.visitEnd();
|
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(
|
mv = (cw.visitMethod(
|
||||||
ACC_PUBLIC, "<init>", "(" + jsonfactoryDesc + typeDesc + objEncoderDesc + ")V", null, null));
|
ACC_PUBLIC, "<init>", "(" + jsonfactoryDesc + typeDesc + objEncoderDesc + ")V", null, null));
|
||||||
@@ -190,11 +162,6 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
|
|||||||
mv.visitLdcInsn(",\"" + fieldName + "\":");
|
mv.visitLdcInsn(",\"" + fieldName + "\":");
|
||||||
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "getBytes", "()[B", false);
|
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "getBytes", "()[B", false);
|
||||||
mv.visitFieldInsn(PUTFIELD, newDynName, fieldName + "CommaFieldBytes", "[B");
|
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
|
// xxxFieldChars
|
||||||
mv.visitVarInsn(ALOAD, 0);
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
mv.visitLdcInsn("\"" + fieldName + "\":");
|
mv.visitLdcInsn("\"" + fieldName + "\":");
|
||||||
@@ -205,11 +172,6 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
|
|||||||
mv.visitLdcInsn(",\"" + fieldName + "\":");
|
mv.visitLdcInsn(",\"" + fieldName + "\":");
|
||||||
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toCharArray", "()[C", false);
|
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toCharArray", "()[C", false);
|
||||||
mv.visitFieldInsn(PUTFIELD, newDynName, fieldName + "CommaFieldChars", "[C");
|
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);
|
mv.visitInsn(RETURN);
|
||||||
Label label2 = new Label();
|
Label label2 = new Label();
|
||||||
@@ -264,176 +226,9 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
|
|||||||
final boolean tiny = ConvertFactory.checkTinyFeature(factory.getFeatures());
|
final boolean tiny = ConvertFactory.checkTinyFeature(factory.getFeatures());
|
||||||
final boolean nullable = ConvertFactory.checkNullableFeature(factory.getFeatures());
|
final boolean nullable = ConvertFactory.checkNullableFeature(factory.getFeatures());
|
||||||
final Class firstType = readGetSetFieldType(elements.get(0));
|
final Class firstType = readGetSetFieldType(elements.get(0));
|
||||||
final boolean mustHadComma = firstType.isPrimitive()
|
final boolean mustHadComma = (firstType.isPrimitive() && (firstType != boolean.class || !tiny || nullable))
|
||||||
&& (firstType != boolean.class || !tiny || nullable); // byte/short/char/int/float/long/double
|
|| membersSize == 1; // 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 {
|
|
||||||
{ // out.writeTo('{');
|
{ // out.writeTo('{');
|
||||||
mv.visitVarInsn(ALOAD, 1);
|
mv.visitVarInsn(ALOAD, 1);
|
||||||
mv.visitIntInsn(BIPUSH, '{');
|
mv.visitIntInsn(BIPUSH, '{');
|
||||||
@@ -634,10 +429,9 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
|
|||||||
INVOKEVIRTUAL, writerName, "writeString", "(Ljava/lang/String;)V", false);
|
INVOKEVIRTUAL, writerName, "writeString", "(Ljava/lang/String;)V", false);
|
||||||
} else {
|
} else {
|
||||||
mv.visitVarInsn(ALOAD, 1);
|
mv.visitVarInsn(ALOAD, 1);
|
||||||
mv.visitInsn(ICONST_1);
|
|
||||||
mv.visitVarInsn(loadid, maxLocals);
|
mv.visitVarInsn(loadid, maxLocals);
|
||||||
mv.visitMethodInsn(
|
mv.visitMethodInsn(
|
||||||
INVOKEVIRTUAL, writerName, "writeLatin1To", "(ZLjava/lang/String;)V", false);
|
INVOKEVIRTUAL, writerName, "writeStandardString", "(Ljava/lang/String;)V", false);
|
||||||
}
|
}
|
||||||
} else { // int[],Boolean[],String[]
|
} else { // int[],Boolean[],String[]
|
||||||
mv.visitVarInsn(ALOAD, 0);
|
mv.visitVarInsn(ALOAD, 0);
|
||||||
|
|||||||
@@ -83,51 +83,14 @@ public abstract class JsonWriter extends Writer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassDepends
|
|
||||||
public abstract void writeFieldShortValue(final byte[] fieldBytes, final char[] fieldChars, final short value);
|
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);
|
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);
|
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);
|
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
|
@Override
|
||||||
@ClassDepends
|
@ClassDepends
|
||||||
public abstract void writeBoolean(boolean value);
|
public abstract void writeBoolean(boolean value);
|
||||||
@@ -140,12 +103,16 @@ public abstract class JsonWriter extends Writer {
|
|||||||
@ClassDepends
|
@ClassDepends
|
||||||
public abstract void writeLong(long value);
|
public abstract void writeLong(long value);
|
||||||
|
|
||||||
public abstract void writeString(final boolean quote, String value);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ClassDepends
|
@ClassDepends
|
||||||
public abstract void writeString(String value);
|
public abstract void writeString(String value);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@ClassDepends
|
||||||
|
public final void writeStandardString(String value) {
|
||||||
|
writeLatin1To(true, value);
|
||||||
|
}
|
||||||
|
|
||||||
@Override // 只容许JsonBytesWriter重写此方法
|
@Override // 只容许JsonBytesWriter重写此方法
|
||||||
public void writeField(EnMember member, String fieldName, Type fieldType, int fieldPos) {
|
public void writeField(EnMember member, String fieldName, Type fieldType, int fieldPos) {
|
||||||
if (this.comma) {
|
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 的字符
|
public final void writeTo(final char... chs) { // 只能是 0 - 127 的字符
|
||||||
writeTo(chs, 0, chs.length);
|
writeTo(chs, 0, chs.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public final void writeByte(byte value) {
|
|
||||||
writeInt(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void writeTo(final byte[] chs) { // 只能是 0 - 127 的字符
|
public final void writeTo(final byte[] chs) { // 只能是 0 - 127 的字符
|
||||||
writeTo(chs, 0, chs.length);
|
writeTo(chs, 0, chs.length);
|
||||||
}
|
}
|
||||||
@@ -201,6 +158,11 @@ public abstract class JsonWriter extends Writer {
|
|||||||
writeArrayE();
|
writeArrayE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void writeByte(byte value) {
|
||||||
|
writeInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void writeChar(char value) {
|
public final void writeChar(char value) {
|
||||||
writeInt(value);
|
writeInt(value);
|
||||||
|
|||||||
Reference in New Issue
Block a user