From 038e61cb1208b89b39081eea414fb8c83e0650c2 Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Mon, 22 Feb 2016 16:35:44 +0800 Subject: [PATCH] --- src/org/redkale/convert/json/JsonReader.java | 64 ++++----- src/org/redkale/convert/json/JsonWriter.java | 141 ++++++++++++++++--- 2 files changed, 153 insertions(+), 52 deletions(-) diff --git a/src/org/redkale/convert/json/JsonReader.java b/src/org/redkale/convert/json/JsonReader.java index 5325f3eb8..ae4f2e712 100644 --- a/src/org/redkale/convert/json/JsonReader.java +++ b/src/org/redkale/convert/json/JsonReader.java @@ -5,7 +5,6 @@ */ package org.redkale.convert.json; -import java.util.function.*; import org.redkale.convert.*; import static org.redkale.convert.Reader.*; import org.redkale.util.*; @@ -26,19 +25,7 @@ public class JsonReader extends Reader { private int limit; public static ObjectPool createPool(int max) { - return new ObjectPool(max, new Creator() { //为了兼容 JDK 6 - - @Override - public JsonReader create(Object... params) { - return new JsonReader(); - } - }, null, new Predicate() { - - @Override - public boolean test(JsonReader t) { - return t.recycle(); - } - }); + return new ObjectPool<>(max, (Object... params) -> new JsonReader(), null, JsonReader::recycle); } public JsonReader() { @@ -107,29 +94,34 @@ public class JsonReader extends Reader { @Override public final void skipValue() { final char ch = nextGoodChar(); - if (ch == '"' || ch == '\'') { - backChar(ch); - readString(); - } else if (ch == '{') { - while (hasNext()) { - this.readSmallString(); //读掉field - this.readBlank(); - this.skipValue(); - } - } else if (ch == '[') { - while (hasNext()) { - this.skipValue(); - } - } else { - char c; - for (;;) { - c = nextChar(); - if (c <= ' ') return; - if (c == '}' || c == ']' || c == ',' || c == ':') { - backChar(c); - return; + switch (ch) { + case '"': + case '\'': + backChar(ch); + readString(); + break; + case '{': + while (hasNext()) { + this.readSmallString(); //读掉field + this.readBlank(); + this.skipValue(); + } + break; + case '[': + while (hasNext()) { + this.skipValue(); + } + break; + default: + char c; + for (;;) { + c = nextChar(); + if (c <= ' ') return; + if (c == '}' || c == ']' || c == ',' || c == ':') { + backChar(c); + return; + } } - } } } diff --git a/src/org/redkale/convert/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index 4b4294976..fb063ca8d 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -6,7 +6,6 @@ package org.redkale.convert.json; import java.nio.*; -import java.util.function.*; import org.redkale.convert.*; import org.redkale.util.*; @@ -34,19 +33,7 @@ public class JsonWriter extends Writer { protected boolean tiny; public static ObjectPool createPool(int max) { - return new ObjectPool(max, new Creator() { - - @Override - public JsonWriter create(Object... params) { - return new JsonWriter(); - } - }, null, new Predicate() { - - @Override - public boolean test(JsonWriter t) { - return t.recycle(); - } - }); + return new ObjectPool<>(max, (Object... params) -> new JsonWriter(), null, (JsonWriter t) -> t.recycle()); } public JsonWriter() { @@ -202,12 +189,97 @@ public class JsonWriter extends Writer { @Override public final void writeInt(int value) { - writeTo(false, String.valueOf(value)); + final char sign = value > 0 ? 0 : '-'; + if (value < 0) value = -value; + int size; + for (int i = 0;; i++) { + if (value <= sizeTable[i]) { + size = i + 1; + break; + } + } + if (sign != 0) size++; //负数 + expand(size); + + int q, r; + int charPos = count + size; + + // Generate two digits per iteration + while (value >= 65536) { + q = value / 100; + // really: r = i - (q * 100); + r = value - ((q << 6) + (q << 5) + (q << 2)); + value = q; + content[--charPos] = DigitOnes[r]; + content[--charPos] = DigitTens[r]; + } + + // Fall thru to fast mode for smaller numbers + // assert(i <= 65536, i); + for (;;) { + q = (value * 52429) >>> (16 + 3); + r = value - ((q << 3) + (q << 1)); // r = i-(q*10) ... + content[--charPos] = digits[r]; + value = q; + if (value == 0) break; + } + if (sign != 0) content[--charPos] = sign; + count += size; } @Override public final void writeLong(long value) { - writeTo(false, String.valueOf(value)); + final char sign = value > 0 ? 0 : '-'; + if (value < 0) 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++; //负数 + expand(size); + + long q; + int r; + int charPos = count + size; + + // Get 2 digits/iteration using longs until quotient fits into an int + while (value > Integer.MAX_VALUE) { + q = value / 100; + // really: r = i - (q * 100); + 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 + int q2; + int i2 = (int) value; + while (i2 >= 65536) { + q2 = i2 / 100; + // really: r = i2 - (q * 100); + r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2)); + i2 = q2; + content[--charPos] = DigitOnes[r]; + content[--charPos] = DigitTens[r]; + } + + // Fall thru to fast mode for smaller numbers + // assert(i2 <= 65536, i2); + 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; } @Override @@ -269,4 +341,41 @@ public class JsonWriter extends Writer { public final void writeMapE() { writeTo('}'); } + + final static char[] DigitTens = { + '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', + '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', + '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', + '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', + '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', + '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', + '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', + '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', + '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', + '9', '9', '9', '9', '9', '9', '9', '9', '9', '9' + }; + + final static char[] DigitOnes = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' + }; + + final static char[] digits = { + '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'a', 'b', + 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z' + }; + + final static int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE}; }