json
This commit is contained in:
@@ -29,9 +29,24 @@ public abstract class TextConvert<R extends Reader, W extends Writer> extends Co
|
||||
|
||||
public abstract <T> T convertFrom(final Type type, final String text);
|
||||
|
||||
/**
|
||||
* 序列化
|
||||
*
|
||||
* @see org.redkale.convert.json.JsonConvert#convertTo(java.lang.reflect.Type, java.lang.Object)
|
||||
* @param value Object
|
||||
* @return String
|
||||
*/
|
||||
public final String convertTo(final Object value) {
|
||||
return convertTo((Type) null, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 序列化
|
||||
*
|
||||
* @see org.redkale.convert.json.JsonConvert#convertTo(java.lang.reflect.Type, java.lang.Object)
|
||||
* @param type Type
|
||||
* @param value Object
|
||||
* @return String
|
||||
*/
|
||||
public abstract String convertTo(final Type type, final Object value);
|
||||
}
|
||||
|
||||
@@ -5,12 +5,11 @@
|
||||
*/
|
||||
package org.redkale.convert.json;
|
||||
|
||||
import static org.redkale.convert.json.JsonWriter.*;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.function.Consumer;
|
||||
import org.redkale.convert.*;
|
||||
import static org.redkale.convert.json.JsonWriter.*;
|
||||
import org.redkale.util.*;
|
||||
|
||||
/**
|
||||
@@ -27,6 +26,8 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
|
||||
private static final byte[] BYTES_FALSEVALUE = "false".getBytes();
|
||||
|
||||
private static final byte[] BYTES_NULL = new byte[] {'n', 'u', 'l', 'l'};
|
||||
|
||||
private static final int TENTHOUSAND_MAX = 10001;
|
||||
|
||||
private static final byte[][] TENTHOUSAND_BYTES = new byte[TENTHOUSAND_MAX][];
|
||||
@@ -105,10 +106,15 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
array.directFrom(content, count);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNull() {
|
||||
writeTo(BYTES_NULL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) {
|
||||
if (this.comma) {
|
||||
writeTo(',');
|
||||
writeTo(BYTE_COMMA);
|
||||
}
|
||||
if (member != null) {
|
||||
byte[] bs = member.getJsonFieldNameBytes();
|
||||
@@ -117,7 +123,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
count += bs.length;
|
||||
} else {
|
||||
writeLatin1To(true, fieldName);
|
||||
writeTo(':');
|
||||
writeTo(BYTE_COLON);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,10 +171,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
int len = bs.length;
|
||||
if (quote) {
|
||||
byte[] src = expand(len + 2);
|
||||
src[count++] = '"';
|
||||
src[count++] = BYTE_DQUOTE;
|
||||
System.arraycopy(bs, 0, src, count, bs.length);
|
||||
count += len;
|
||||
src[count++] = '"';
|
||||
src[count++] = BYTE_DQUOTE;
|
||||
} else {
|
||||
byte[] src = expand(len);
|
||||
System.arraycopy(bs, 0, src, count, bs.length);
|
||||
@@ -230,10 +236,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
byte[] src = expand(len1 + len2 + 2);
|
||||
System.arraycopy(bs1, 0, src, count, len1);
|
||||
count += len1;
|
||||
src[count++] = '"';
|
||||
src[count++] = BYTE_DQUOTE;
|
||||
System.arraycopy(bs2, 0, src, count, len2);
|
||||
count += len2;
|
||||
src[count++] = '"';
|
||||
src[count++] = BYTE_DQUOTE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -249,7 +255,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
count += len1;
|
||||
System.arraycopy(bs2, 0, src, count, len2);
|
||||
count += len2;
|
||||
src[count++] = '}';
|
||||
src[count++] = BYTE_RBRACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -265,7 +271,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
count += len1;
|
||||
System.arraycopy(bs2, 0, src, count, len2);
|
||||
count += len2;
|
||||
src[count++] = '}';
|
||||
src[count++] = BYTE_RBRACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -281,7 +287,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
count += len1;
|
||||
System.arraycopy(bs2, 0, src, count, len2);
|
||||
count += len2;
|
||||
src[count++] = '}';
|
||||
src[count++] = BYTE_RBRACE;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -289,12 +295,12 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
if (value == null && nullable()) {
|
||||
writeTo(fieldBytes);
|
||||
writeNull();
|
||||
writeTo('}');
|
||||
writeTo(BYTE_RBRACE);
|
||||
return;
|
||||
}
|
||||
if (value == null || (tiny() && value.isEmpty())) {
|
||||
expand(1);
|
||||
content[count++] = '}';
|
||||
content[count++] = BYTE_RBRACE;
|
||||
} else {
|
||||
byte[] bs1 = fieldBytes;
|
||||
byte[] bs2 = Utility.latin1ByteArray(value);
|
||||
@@ -304,11 +310,11 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
int c = count;
|
||||
System.arraycopy(bs1, 0, src, c, len1);
|
||||
c += len1;
|
||||
src[c++] = '"';
|
||||
src[c++] = BYTE_DQUOTE;
|
||||
System.arraycopy(bs2, 0, src, c, len2);
|
||||
c += len2;
|
||||
src[c++] = '"';
|
||||
src[c++] = '}';
|
||||
src[c++] = BYTE_DQUOTE;
|
||||
src[c++] = BYTE_RBRACE;
|
||||
count = c;
|
||||
}
|
||||
}
|
||||
@@ -316,16 +322,16 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
@Override // firstFieldBytes 必须带{开头
|
||||
public void writeObjectByOnlyOneLatin1FieldValue(final byte[] firstFieldBytes, final String value) {
|
||||
if (value == null && nullable()) {
|
||||
writeTo('{');
|
||||
writeTo(BYTE_LBRACE);
|
||||
writeTo(firstFieldBytes);
|
||||
writeNull();
|
||||
writeTo('}');
|
||||
writeTo(BYTE_RBRACE);
|
||||
return;
|
||||
}
|
||||
if (value == null || (tiny() && value.isEmpty())) {
|
||||
expand(2);
|
||||
content[count++] = '{';
|
||||
content[count++] = '}';
|
||||
content[count++] = BYTE_LBRACE;
|
||||
content[count++] = BYTE_RBRACE;
|
||||
} else {
|
||||
byte[] bs1 = firstFieldBytes;
|
||||
byte[] bs2 = Utility.latin1ByteArray(value);
|
||||
@@ -335,11 +341,11 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
int c = count;
|
||||
System.arraycopy(bs1, 0, src, c, len1);
|
||||
c += len1;
|
||||
src[c++] = '"';
|
||||
src[c++] = BYTE_DQUOTE;
|
||||
System.arraycopy(bs2, 0, src, c, len2);
|
||||
c += len2;
|
||||
src[c++] = '"';
|
||||
src[c++] = '}';
|
||||
src[c++] = BYTE_DQUOTE;
|
||||
src[c++] = BYTE_RBRACE;
|
||||
count = c;
|
||||
}
|
||||
}
|
||||
@@ -368,7 +374,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
count += len3;
|
||||
System.arraycopy(bs4, 0, src, count, len4);
|
||||
count += len4;
|
||||
src[count++] = '}';
|
||||
src[count++] = BYTE_RBRACE;
|
||||
}
|
||||
|
||||
public JsonBytesWriter clear() {
|
||||
@@ -403,7 +409,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
byte[] bytes = expand(value.length * 2 + 2);
|
||||
int curr = count;
|
||||
if (quote) {
|
||||
bytes[curr++] = '"';
|
||||
bytes[curr++] = BYTE_DQUOTE;
|
||||
}
|
||||
for (byte b : value) {
|
||||
if (b == '"') {
|
||||
@@ -430,7 +436,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
}
|
||||
}
|
||||
if (quote) {
|
||||
bytes[curr++] = '"';
|
||||
bytes[curr++] = BYTE_DQUOTE;
|
||||
}
|
||||
count = curr;
|
||||
}
|
||||
@@ -453,7 +459,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
byte[] bytes = expand(value.length() * 4 + 2);
|
||||
int curr = count;
|
||||
if (quote) {
|
||||
bytes[curr++] = '"';
|
||||
bytes[curr++] = BYTE_DQUOTE;
|
||||
}
|
||||
int len = value.length();
|
||||
for (int i = 0; i < len; i++) {
|
||||
@@ -500,7 +506,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
|
||||
}
|
||||
}
|
||||
if (quote) {
|
||||
bytes[curr++] = '"';
|
||||
bytes[curr++] = BYTE_DQUOTE;
|
||||
}
|
||||
count = curr;
|
||||
}
|
||||
|
||||
@@ -36,6 +36,15 @@ class JsonStreamWriter extends JsonByteBufferWriter {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(final byte ch) {
|
||||
try {
|
||||
out.write(ch);
|
||||
} catch (IOException e) {
|
||||
throw new ConvertException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(final char ch) {
|
||||
if (ch > Byte.MAX_VALUE) {
|
||||
|
||||
@@ -22,6 +22,22 @@ public abstract class JsonWriter extends Writer {
|
||||
"redkale.convert.json.writer.buffer.defsize",
|
||||
Integer.getInteger("redkale.convert.writer.buffer.defsize", 1024));
|
||||
|
||||
private static final char[] CHARS_NULL = new char[] {'n', 'u', 'l', 'l'};
|
||||
|
||||
protected static final byte BYTE_COMMA = ',';
|
||||
|
||||
protected static final byte BYTE_COLON = ':';
|
||||
|
||||
protected static final byte BYTE_LBRACE = '{';
|
||||
|
||||
protected static final byte BYTE_RBRACE = '}';
|
||||
|
||||
protected static final byte BYTE_LBRACKET = '[';
|
||||
|
||||
protected static final byte BYTE_RBRACKET = ']';
|
||||
|
||||
protected static final byte BYTE_DQUOTE = '"';
|
||||
|
||||
protected JsonWriter() {
|
||||
this.features = JsonFactory.root().getFeatures();
|
||||
}
|
||||
@@ -108,13 +124,13 @@ public abstract class JsonWriter extends Writer {
|
||||
@Override // 只容许JsonBytesWriter重写此方法
|
||||
public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) {
|
||||
if (this.comma) {
|
||||
writeTo(',');
|
||||
writeTo(BYTE_COMMA);
|
||||
}
|
||||
if (member != null) {
|
||||
writeTo(member.getJsonFieldNameChars());
|
||||
} else {
|
||||
writeLatin1To(true, fieldName);
|
||||
writeTo(':');
|
||||
writeTo(BYTE_COLON);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -186,52 +202,52 @@ public abstract class JsonWriter extends Writer {
|
||||
@Override
|
||||
public final int writeObjectB(Object obj) {
|
||||
super.writeObjectB(obj);
|
||||
writeTo('{');
|
||||
writeTo(BYTE_LBRACE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeObjectE(Object obj) {
|
||||
writeTo('}');
|
||||
writeTo(BYTE_RBRACE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeNull() {
|
||||
writeTo('n', 'u', 'l', 'l');
|
||||
public void writeNull() {
|
||||
writeTo(CHARS_NULL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int writeArrayB(
|
||||
int size, Encodeable arrayEncoder, Encodeable<Writer, Object> componentEncoder, Object obj) {
|
||||
writeTo('[');
|
||||
writeTo(BYTE_LBRACKET);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeArrayMark() {
|
||||
writeTo(',');
|
||||
writeTo(BYTE_COMMA);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeArrayE() {
|
||||
writeTo(']');
|
||||
writeTo(BYTE_RBRACKET);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int writeMapB(
|
||||
int size, Encodeable<Writer, Object> keyEncoder, Encodeable<Writer, Object> valueEncoder, Object obj) {
|
||||
writeTo('{');
|
||||
writeTo(BYTE_LBRACE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeMapMark() {
|
||||
writeTo(':');
|
||||
writeTo(BYTE_COLON);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void writeMapE() {
|
||||
writeTo('}');
|
||||
writeTo(BYTE_RBRACE);
|
||||
}
|
||||
|
||||
static final char[] DigitTens = {
|
||||
|
||||
@@ -176,10 +176,6 @@ public class HttpRequest extends Request<HttpContext> {
|
||||
// 主要给chunked和unzip用的
|
||||
private ByteArray array;
|
||||
|
||||
private String lastPathString;
|
||||
|
||||
private byte[] lastPathBytes;
|
||||
|
||||
private final ByteArray bodyBytes;
|
||||
|
||||
private final ByteArray headerBytes;
|
||||
@@ -784,8 +780,6 @@ public class HttpRequest extends Request<HttpContext> {
|
||||
: context.loadUriPath(bytes, qst, latin1, charset);
|
||||
int qlen = size - qst - 1;
|
||||
this.queryBytes = bytes.getBytes(qst + 1, qlen);
|
||||
this.lastPathString = null;
|
||||
this.lastPathBytes = null;
|
||||
try {
|
||||
addParameter(bytes, false, qst + 1, qlen);
|
||||
} catch (Exception e) {
|
||||
@@ -796,21 +790,8 @@ public class HttpRequest extends Request<HttpContext> {
|
||||
} else { // 没有带?参数
|
||||
if (decodeable) { // 需要转义
|
||||
this.requestPath = toDecodeString(bytes, 0, bytes.length(), charset);
|
||||
this.lastPathString = null;
|
||||
this.lastPathBytes = null;
|
||||
} else if (context.lazyHeader) {
|
||||
byte[] lastURIBytes = lastPathBytes;
|
||||
if (lastURIBytes != null && lastURIBytes.length == size && bytes.deepEquals(lastURIBytes)) {
|
||||
this.requestPath = this.lastPathString;
|
||||
} else {
|
||||
this.requestPath = context.loadUriPath(bytes, latin1, charset);
|
||||
this.lastPathString = this.requestPath;
|
||||
this.lastPathBytes = bytes.getBytes();
|
||||
}
|
||||
} else {
|
||||
this.requestPath = context.loadUriPath(bytes, latin1, charset);
|
||||
this.lastPathString = null;
|
||||
this.lastPathBytes = null;
|
||||
}
|
||||
this.queryBytes = EMPTY_BYTES;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ public class ScheduledTest {
|
||||
System.out.println("开始执行");
|
||||
Utility.sleep(2000);
|
||||
manager.stop("task2");
|
||||
Utility.sleep(1010);
|
||||
Utility.sleep(1001);
|
||||
manager.unschedule(service);
|
||||
manager.destroy(null);
|
||||
Assertions.assertEquals(3, service.count1.get());
|
||||
|
||||
Reference in New Issue
Block a user