json
This commit is contained in:
@@ -601,47 +601,26 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
count += bs.length;
|
count += bs.length;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final byte sign = value >= 0 ? 0 : BYTE_NEGATIVE;
|
final boolean negative = value < 0;
|
||||||
if (value < 0) {
|
int size = stringSize(value);
|
||||||
value = -value;
|
|
||||||
}
|
|
||||||
int size;
|
|
||||||
for (int i = 0; ; i++) {
|
|
||||||
if (value <= sizeTable[i]) {
|
|
||||||
size = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sign != 0) {
|
|
||||||
size++; // 负数
|
|
||||||
}
|
|
||||||
byte[] bytes = expand(size);
|
byte[] bytes = expand(size);
|
||||||
|
|
||||||
int q, r;
|
|
||||||
int charPos = count + size;
|
int charPos = count + size;
|
||||||
|
int i = negative ? value : -value;
|
||||||
|
int q, r;
|
||||||
// Generate two digits per iteration
|
// Generate two digits per iteration
|
||||||
while (value >= 65536) {
|
while (i <= -100) {
|
||||||
q = value / 100;
|
q = i / 100;
|
||||||
// really: r = i - (q * 100);
|
r = (q * 100) - i;
|
||||||
r = value - ((q << 6) + (q << 5) + (q << 2));
|
i = q;
|
||||||
value = q;
|
|
||||||
bytes[--charPos] = (byte) DigitOnes[r];
|
bytes[--charPos] = (byte) DigitOnes[r];
|
||||||
bytes[--charPos] = (byte) DigitTens[r];
|
bytes[--charPos] = (byte) DigitTens[r];
|
||||||
}
|
}
|
||||||
|
// We know there are at most two digits left at this point.
|
||||||
// Fall thru to fast mode for smaller numbers
|
bytes[--charPos] = (byte) DigitOnes[-i];
|
||||||
// assert(i <= 65536, i);
|
if (i < -9) {
|
||||||
for (; ; ) {
|
bytes[--charPos] = (byte) DigitTens[-i];
|
||||||
q = (value * 52429) >>> (16 + 3);
|
|
||||||
r = value - ((q << 3) + (q << 1)); // r = i-(q*10) ...
|
|
||||||
bytes[--charPos] = (byte) digits[r];
|
|
||||||
value = q;
|
|
||||||
if (value == 0) {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
if (negative) {
|
||||||
if (sign != 0) {
|
|
||||||
bytes[--charPos] = BYTE_NEGATIVE;
|
bytes[--charPos] = BYTE_NEGATIVE;
|
||||||
}
|
}
|
||||||
count += size;
|
count += size;
|
||||||
@@ -663,63 +642,38 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
|||||||
count += bs.length;
|
count += bs.length;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final char sign = value >= 0 ? 0 : '-';
|
final boolean negative = value < 0;
|
||||||
if (value < 0) {
|
int size = stringSize(value);
|
||||||
value = -value;
|
|
||||||
}
|
|
||||||
int size = 19;
|
|
||||||
long p = 10;
|
|
||||||
for (int i = 1; i < 19; i++) {
|
|
||||||
if (value < p) {
|
|
||||||
size = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = 10 * p;
|
|
||||||
}
|
|
||||||
if (sign != 0) {
|
|
||||||
size++; // 负数
|
|
||||||
}
|
|
||||||
byte[] bytes = expand(size);
|
byte[] bytes = expand(size);
|
||||||
|
int charPos = count + size;
|
||||||
|
long i = negative ? value : -value;
|
||||||
long q;
|
long q;
|
||||||
int r;
|
int r;
|
||||||
int charPos = count + size;
|
while (i <= Integer.MIN_VALUE) {
|
||||||
|
q = i / 100;
|
||||||
// Get 2 digits/iteration using longs until quotient fits into an int
|
r = (int) ((q * 100) - i);
|
||||||
while (value > Integer.MAX_VALUE) {
|
i = q;
|
||||||
q = value / 100;
|
bytes[--charPos] = (byte) DigitOnes[r];
|
||||||
// really: r = i - (q * 100);
|
bytes[--charPos] = (byte) DigitTens[r];
|
||||||
r = (int) (value - ((q << 6) + (q << 5) + (q << 2)));
|
|
||||||
value = q;
|
|
||||||
content[--charPos] = (byte) DigitOnes[r];
|
|
||||||
content[--charPos] = (byte) DigitTens[r];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get 2 digits/iteration using ints
|
// Get 2 digits/iteration using ints
|
||||||
int q2;
|
int q2;
|
||||||
int i2 = (int) value;
|
int i2 = (int) i;
|
||||||
while (i2 >= 65536) {
|
while (i2 <= -100) {
|
||||||
q2 = i2 / 100;
|
q2 = i2 / 100;
|
||||||
// really: r = i2 - (q * 100);
|
r = (q2 * 100) - i2;
|
||||||
r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
|
|
||||||
i2 = q2;
|
i2 = q2;
|
||||||
bytes[--charPos] = (byte) DigitOnes[r];
|
bytes[--charPos] = (byte) DigitOnes[r];
|
||||||
bytes[--charPos] = (byte) DigitTens[r];
|
bytes[--charPos] = (byte) DigitTens[r];
|
||||||
}
|
}
|
||||||
|
// We know there are at most two digits left at this point.
|
||||||
|
bytes[--charPos] = (byte) DigitOnes[-i2];
|
||||||
|
if (i2 < -9) {
|
||||||
|
bytes[--charPos] = (byte) DigitTens[-i2];
|
||||||
|
}
|
||||||
|
|
||||||
// Fall thru to fast mode for smaller numbers
|
if (negative) {
|
||||||
// assert(i2 <= 65536, i2);
|
bytes[--charPos] = BYTE_NEGATIVE;
|
||||||
for (; ; ) {
|
|
||||||
q2 = (i2 * 52429) >>> (16 + 3);
|
|
||||||
r = i2 - ((q2 << 3) + (q2 << 1)); // r = i2-(q2*10) ...
|
|
||||||
bytes[--charPos] = (byte) digits[r];
|
|
||||||
i2 = q2;
|
|
||||||
if (i2 == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sign != 0) {
|
|
||||||
bytes[--charPos] = (byte) sign;
|
|
||||||
}
|
}
|
||||||
count += size;
|
count += size;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import static org.redkale.convert.json.JsonWriter.BYTE_DQUOTE;
|
|||||||
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;
|
||||||
import static org.redkale.convert.json.JsonWriter.digits;
|
|
||||||
import static org.redkale.convert.json.JsonWriter.sizeTable;
|
|
||||||
import org.redkale.util.StringWrapper;
|
import org.redkale.util.StringWrapper;
|
||||||
import org.redkale.util.Utility;
|
import org.redkale.util.Utility;
|
||||||
|
|
||||||
@@ -448,44 +446,28 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
writeTo(TENTHOUSAND_CHARS2[-value]);
|
writeTo(TENTHOUSAND_CHARS2[-value]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final char sign = value >= 0 ? 0 : '-';
|
final boolean negative = value < 0;
|
||||||
if (value < 0) value = -value;
|
int size = stringSize(value);
|
||||||
int size;
|
|
||||||
for (int i = 0; ; i++) {
|
|
||||||
if (value <= sizeTable[i]) {
|
|
||||||
size = i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sign != 0) {
|
|
||||||
size++; // 负数
|
|
||||||
}
|
|
||||||
char[] chars = expand(size);
|
char[] chars = expand(size);
|
||||||
|
|
||||||
int q, r;
|
|
||||||
int charPos = count + size;
|
int charPos = count + size;
|
||||||
|
int i = negative ? value : -value;
|
||||||
|
int q, r;
|
||||||
// Generate two digits per iteration
|
// Generate two digits per iteration
|
||||||
while (value >= 65536) {
|
while (i <= -100) {
|
||||||
q = value / 100;
|
q = i / 100;
|
||||||
// really: r = i - (q * 100);
|
r = (q * 100) - i;
|
||||||
r = value - ((q << 6) + (q << 5) + (q << 2));
|
i = q;
|
||||||
value = q;
|
|
||||||
chars[--charPos] = DigitOnes[r];
|
chars[--charPos] = DigitOnes[r];
|
||||||
chars[--charPos] = DigitTens[r];
|
chars[--charPos] = DigitTens[r];
|
||||||
}
|
}
|
||||||
|
// We know there are at most two digits left at this point.
|
||||||
// Fall thru to fast mode for smaller numbers
|
chars[--charPos] = DigitOnes[-i];
|
||||||
// assert(i <= 65536, i);
|
if (i < -9) {
|
||||||
for (; ; ) {
|
chars[--charPos] = DigitTens[-i];
|
||||||
q = (value * 52429) >>> (16 + 3);
|
|
||||||
r = value - ((q << 3) + (q << 1)); // r = i-(q*10) ...
|
|
||||||
chars[--charPos] = digits[r];
|
|
||||||
value = q;
|
|
||||||
if (value == 0) break;
|
|
||||||
}
|
}
|
||||||
if (sign != 0) {
|
|
||||||
chars[--charPos] = sign;
|
if (negative) {
|
||||||
|
chars[--charPos] = '-';
|
||||||
}
|
}
|
||||||
count += size;
|
count += size;
|
||||||
}
|
}
|
||||||
@@ -500,56 +482,39 @@ public class JsonCharsWriter extends JsonWriter {
|
|||||||
writeTo(TENTHOUSAND_CHARS2[(int) -value]);
|
writeTo(TENTHOUSAND_CHARS2[(int) -value]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final char sign = value >= 0 ? 0 : '-';
|
final boolean negative = value < 0;
|
||||||
if (value < 0) value = -value;
|
int size = stringSize(value);
|
||||||
int size = 19;
|
char[] chars = expand(size);
|
||||||
long p = 10;
|
int charPos = count + size;
|
||||||
for (int i = 1; i < 19; i++) {
|
long i = negative ? value : -value;
|
||||||
if (value < p) {
|
|
||||||
size = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = 10 * p;
|
|
||||||
}
|
|
||||||
if (sign != 0) size++; // 负数
|
|
||||||
expand(size);
|
|
||||||
|
|
||||||
long q;
|
long q;
|
||||||
int r;
|
int r;
|
||||||
int charPos = count + size;
|
while (i <= Integer.MIN_VALUE) {
|
||||||
|
q = i / 100;
|
||||||
// Get 2 digits/iteration using longs until quotient fits into an int
|
r = (int) ((q * 100) - i);
|
||||||
while (value > Integer.MAX_VALUE) {
|
i = q;
|
||||||
q = value / 100;
|
chars[--charPos] = DigitOnes[r];
|
||||||
// really: r = i - (q * 100);
|
chars[--charPos] = DigitTens[r];
|
||||||
r = (int) (value - ((q << 6) + (q << 5) + (q << 2)));
|
|
||||||
value = q;
|
|
||||||
content[--charPos] = DigitOnes[r];
|
|
||||||
content[--charPos] = DigitTens[r];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get 2 digits/iteration using ints
|
// Get 2 digits/iteration using ints
|
||||||
int q2;
|
int q2;
|
||||||
int i2 = (int) value;
|
int i2 = (int) i;
|
||||||
while (i2 >= 65536) {
|
while (i2 <= -100) {
|
||||||
q2 = i2 / 100;
|
q2 = i2 / 100;
|
||||||
// really: r = i2 - (q * 100);
|
r = (q2 * 100) - i2;
|
||||||
r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
|
|
||||||
i2 = q2;
|
i2 = q2;
|
||||||
content[--charPos] = DigitOnes[r];
|
chars[--charPos] = DigitOnes[r];
|
||||||
content[--charPos] = DigitTens[r];
|
chars[--charPos] = DigitTens[r];
|
||||||
|
}
|
||||||
|
// We know there are at most two digits left at this point.
|
||||||
|
chars[--charPos] = DigitOnes[-i2];
|
||||||
|
if (i2 < -9) {
|
||||||
|
chars[--charPos] = DigitTens[-i2];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fall thru to fast mode for smaller numbers
|
if (negative) {
|
||||||
// assert(i2 <= 65536, i2);
|
chars[--charPos] = '-';
|
||||||
for (; ; ) {
|
|
||||||
q2 = (i2 * 52429) >>> (16 + 3);
|
|
||||||
r = i2 - ((q2 << 3) + (q2 << 1)); // r = i2-(q2*10) ...
|
|
||||||
content[--charPos] = digits[r];
|
|
||||||
i2 = q2;
|
|
||||||
if (i2 == 0) break;
|
|
||||||
}
|
}
|
||||||
if (sign != 0) content[--charPos] = sign;
|
|
||||||
count += size;
|
count += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -362,14 +362,31 @@ public abstract class JsonWriter extends Writer {
|
|||||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
|
||||||
};
|
};
|
||||||
|
|
||||||
static final char[] digits = {
|
protected static int stringSize(int x) {
|
||||||
'0', '1', '2', '3', '4', '5',
|
int d = 1;
|
||||||
'6', '7', '8', '9', 'a', 'b',
|
if (x >= 0) {
|
||||||
'c', 'd', 'e', 'f', 'g', 'h',
|
d = 0;
|
||||||
'i', 'j', 'k', 'l', 'm', 'n',
|
x = -x;
|
||||||
'o', 'p', 'q', 'r', 's', 't',
|
}
|
||||||
'u', 'v', 'w', 'x', 'y', 'z'
|
int p = -10;
|
||||||
};
|
for (int i = 1; i < 10; i++) {
|
||||||
|
if (x > p) return i + d;
|
||||||
|
p = 10 * p;
|
||||||
|
}
|
||||||
|
return 10 + d;
|
||||||
|
}
|
||||||
|
|
||||||
static final int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE};
|
protected static int stringSize(long x) {
|
||||||
|
int d = 1;
|
||||||
|
if (x >= 0) {
|
||||||
|
d = 0;
|
||||||
|
x = -x;
|
||||||
|
}
|
||||||
|
long p = -10;
|
||||||
|
for (int i = 1; i < 19; i++) {
|
||||||
|
if (x > p) return i + d;
|
||||||
|
p = 10 * p;
|
||||||
|
}
|
||||||
|
return 19 + d;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ public class _DyncUserJsonEncoder extends JsonDynEncoder<User> {
|
|||||||
comma = out.writeFieldLongValue(idFieldBytes, idFieldChars, comma, value.getId());
|
comma = out.writeFieldLongValue(idFieldBytes, idFieldChars, comma, value.getId());
|
||||||
comma = out.writeFieldStringValue(nameFieldBytes, nameFieldChars, comma, value.getName());
|
comma = out.writeFieldStringValue(nameFieldBytes, nameFieldChars, comma, value.getName());
|
||||||
comma = out.writeFieldStringValue(sexFieldBytes, sexFieldChars, comma, value.getSex());
|
comma = out.writeFieldStringValue(sexFieldBytes, sexFieldChars, comma, value.getSex());
|
||||||
comma = out.writeFieldStringValue(nickNameFieldBytes, nickNameFieldChars, comma, value.getNickName());
|
out.writeFieldStringValue(nickNameFieldBytes, nickNameFieldChars, comma, value.getNickName());
|
||||||
out.writeTo('}');
|
out.writeTo('}');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public class _DyncWorldJsonEncoder extends JsonDynEncoder<World> {
|
|||||||
out.writeTo('{');
|
out.writeTo('{');
|
||||||
boolean comma = false;
|
boolean comma = false;
|
||||||
comma = out.writeFieldIntValue(idFieldBytes, idFieldChars, comma, value.getId());
|
comma = out.writeFieldIntValue(idFieldBytes, idFieldChars, comma, value.getId());
|
||||||
comma = out.writeFieldIntValue(randomNumberFieldBytes, randomNumberFieldChars, comma, value.getRandomNumber());
|
out.writeFieldIntValue(randomNumberFieldBytes, randomNumberFieldChars, comma, value.getRandomNumber());
|
||||||
out.writeTo('}');
|
out.writeTo('}');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user