package com.github.ltsopensource.json;
import com.github.ltsopensource.core.commons.utils.PrimitiveTypeUtils;
import com.github.ltsopensource.json.deserializer.*;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* @author Robert HG (254963746@qq.com) on 12/29/15.
*/
public class JSONParser {
protected static final ConcurrentMap<Type, Deserializer>
deserializerMap = new ConcurrentHashMap<Type, Deserializer>();
public static <T> T parse(Object object, Type type) {
Deserializer deserializer = getDeserializer(type);
return deserializer.deserialize(object, type);
}
public static Deserializer getDeserializer(Type type) {
Deserializer deserializer = deserializerMap.get(type);
if (deserializer != null) {
return deserializer;
}
if (type instanceof Class<?>) {
return getDeserializer((Class<?>) type, type);
}
if (type instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) type).getRawType();
if (rawType instanceof Class<?>) {
return getDeserializer((Class<?>) rawType, type);
} else {
return getDeserializer(rawType);
}
}
if (type instanceof GenericArrayType) {
return ArrayDeserializer.INSTANCE;
}
throw new IllegalArgumentException("can't get the Deserializer by " + type);
}
private static Deserializer getDeserializer(Class<?> clazz, Type type) {
Deserializer deserializer;
if (PrimitiveTypeUtils.isPrimitiveClass(clazz)) {
deserializer = new PrimitiveTypeDeserializer();
} else if (clazz.isEnum()) {
deserializer = new EnumDeserializer(clazz);
} else if (clazz.isArray()) {
deserializer = ArrayDeserializer.INSTANCE;
} else if (clazz == Set.class || clazz == HashSet.class || clazz == Collection.class || clazz == List.class
|| clazz == ArrayList.class) {
deserializer = CollectionDeserializer.INSTANCE;
} else if (Collection.class.isAssignableFrom(clazz)) {
deserializer = CollectionDeserializer.INSTANCE;
} else if (Map.class.isAssignableFrom(clazz)) {
deserializer = MapDeserializer.INSTANCE;
} else {
deserializer = new JavaBeanDeserializer(clazz);
}
deserializerMap.put(type, deserializer);
return deserializer;
}
}