This commit is contained in:
Redkale
2019-01-07 21:09:22 +08:00
parent 6855d06f55
commit cc98a85711
5 changed files with 45 additions and 36 deletions

View File

@@ -3,23 +3,19 @@
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.convert.json;
package org.redkale.convert;
import java.lang.reflect.*;
import java.lang.reflect.Type;
import java.util.*;
import org.redkale.convert.*;
import org.redkale.convert.json.JsonReader.ValueType;
import org.redkale.util.*;
import org.redkale.convert.Reader.ValueType;
import static org.redkale.convert.Reader.ValueType.MAP;
/**
* 对不明类型的对象进行JSON反序列化
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
*/
@SuppressWarnings("unchecked")
public final class JsonAnyDecoder implements Decodeable<JsonReader, Object> {
public class AnyDecoder implements Decodeable<Reader, Object> {
private static final Type collectionObjectType = new TypeToken<Collection<Object>>() {
}.getType();
@@ -31,26 +27,26 @@ public final class JsonAnyDecoder implements Decodeable<JsonReader, Object> {
private static final Creator<HashMap> mapCreator = Creator.create(HashMap.class);
protected final Decodeable<JsonReader, String> stringDecoder;
protected final Decodeable<Reader, String> stringDecoder;
protected final CollectionDecoder collectionDecoder;
protected final MapDecoder mapDecoder;
public JsonAnyDecoder(final ConvertFactory factory) {
public AnyDecoder(final ConvertFactory factory) {
this.stringDecoder = factory.loadDecoder(String.class);
this.collectionDecoder = new CollectionDecoder(factory, collectionObjectType, Object.class, collectionCreator, this);
this.mapDecoder = new MapDecoder(factory, mapObjectType, String.class, Object.class, mapCreator, stringDecoder, this);
}
@Override
public Object convertFrom(JsonReader in) {
public Object convertFrom(Reader in) {
ValueType vt = in.readType();
if (vt == null) return null;
switch (vt) {
case COLLECTION:
case ARRAY:
return this.collectionDecoder.convertFrom(in);
case JSONOBJECT:
case MAP:
return this.mapDecoder.convertFrom(in);
}
return this.stringDecoder.convertFrom(in);

View File

@@ -15,6 +15,10 @@ package org.redkale.convert;
*/
public abstract class Reader {
public static enum ValueType {
STRING, ARRAY, MAP;
}
//当前对象字段名的游标
protected int fieldIndex;
@@ -73,6 +77,13 @@ public abstract class Reader {
*/
public abstract void readBlank();
/**
* 读取下个值的类型
*
* @return ValueType
*/
public abstract ValueType readType();
/**
* 读取对象的类名, 返回 null 表示对象为null 返回空字符串表示当前class与返回的class一致返回非空字符串表示class是当前class的子类。
*

View File

@@ -346,4 +346,9 @@ public class BsonReader extends Reader {
return value;
}
@Override
public ValueType readType() {
throw new UnsupportedOperationException("Not supported yet.");
}
}

View File

@@ -128,43 +128,43 @@ public final class JsonConvert extends TextConvert<JsonReader, JsonWriter> {
return rs;
}
public Object convertFrom(final String text) {
public <V> V convertFrom(final String text) {
if (text == null) return null;
return convertFrom(Utility.charArray(text));
return (V) convertFrom(Utility.charArray(text));
}
public Object convertFrom(final char[] text) {
public <V> V convertFrom(final char[] text) {
if (text == null) return null;
return convertFrom(text, 0, text.length);
return (V) convertFrom(text, 0, text.length);
}
public Object convertFrom(final char[] text, final int start, final int len) {
public <V> V convertFrom(final char[] text, final int start, final int len) {
if (text == null) return null;
final JsonReader in = readerPool.get();
in.setText(text, start, len);
Object rs = new JsonAnyDecoder(factory).convertFrom(in);
Object rs = new AnyDecoder(factory).convertFrom(in);
readerPool.accept(in);
return rs;
return (V) rs;
}
public Object convertFrom(final InputStream in) {
public <V> V convertFrom(final InputStream in) {
if (in == null) return null;
return new JsonAnyDecoder(factory).convertFrom(new JsonStreamReader(in));
return (V) new AnyDecoder(factory).convertFrom(new JsonStreamReader(in));
}
public Object convertFrom(final ByteBuffer... buffers) {
public <V> V convertFrom(final ByteBuffer... buffers) {
if (buffers == null || buffers.length == 0) return null;
return new JsonAnyDecoder(factory).convertFrom(new JsonByteBufferReader((ConvertMask) null, buffers));
return (V) new AnyDecoder(factory).convertFrom(new JsonByteBufferReader((ConvertMask) null, buffers));
}
public Object convertFrom(final ConvertMask mask, final ByteBuffer... buffers) {
public <V> V convertFrom(final ConvertMask mask, final ByteBuffer... buffers) {
if (buffers == null || buffers.length == 0) return null;
return new JsonAnyDecoder(factory).convertFrom(new JsonByteBufferReader(mask, buffers));
return (V) new AnyDecoder(factory).convertFrom(new JsonByteBufferReader(mask, buffers));
}
public Object convertFrom(final JsonReader reader) {
public <V> V convertFrom(final JsonReader reader) {
if (reader == null) return null;
return new JsonAnyDecoder(factory).convertFrom(reader);
return (V) new AnyDecoder(factory).convertFrom(reader);
}
//------------------------------ convertTo -----------------------------------------------------------

View File

@@ -19,10 +19,6 @@ import org.redkale.util.*;
*/
public class JsonReader extends Reader {
static enum ValueType {
STRING, COLLECTION, JSONOBJECT;
}
protected int position = -1;
private char[] text;
@@ -162,15 +158,16 @@ public class JsonReader extends Reader {
this.position--;
}
final ValueType readType() {
@Override
public final ValueType readType() {
char ch = nextGoodChar();
if (ch == '{') {
backChar(ch);
return ValueType.JSONOBJECT;
return ValueType.MAP;
}
if (ch == '[') {
backChar(ch);
return ValueType.COLLECTION;
return ValueType.ARRAY;
}
backChar(ch);
return ValueType.STRING;