|
@@ -0,0 +1,543 @@
|
|
|
+package com.lts.core.json;
|
|
|
+
|
|
|
+import com.lts.core.commons.utils.Base64;
|
|
|
+
|
|
|
+import java.lang.reflect.Array;
|
|
|
+import java.lang.reflect.Method;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * from fastjson
|
|
|
+ * @author Robert HG (254963746@qq.com) on 11/21/15.
|
|
|
+ */
|
|
|
+public class TypeUtils {
|
|
|
+
|
|
|
+ public static final String castToString(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return value.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Byte castToByte(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).byteValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return Byte.parseByte(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to byte, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Short castToShort(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).shortValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return Short.parseShort(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to short, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final BigDecimal castToBigDecimal(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof BigDecimal) {
|
|
|
+ return (BigDecimal) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof BigInteger) {
|
|
|
+ return new BigDecimal((BigInteger) value);
|
|
|
+ }
|
|
|
+
|
|
|
+ String strVal = value.toString();
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return new BigDecimal(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final BigInteger castToBigInteger(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof BigInteger) {
|
|
|
+ return (BigInteger) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Float || value instanceof Double) {
|
|
|
+ return BigInteger.valueOf(((Number) value).longValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ String strVal = value.toString();
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return new BigInteger(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Float castToFloat(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).floatValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = value.toString();
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return Float.parseFloat(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to float, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Double castToDouble(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).doubleValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = value.toString();
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return Double.parseDouble(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to double, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Date castToDate(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Calendar) {
|
|
|
+ return ((Calendar) value).getTime();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Date) {
|
|
|
+ return (Date) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ long longValue = -1;
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ longValue = ((Number) value).longValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+
|
|
|
+ if (strVal.indexOf('-') != -1) {
|
|
|
+ String format;
|
|
|
+ if (strVal.length() == 10) {
|
|
|
+ format = "yyyy-MM-dd";
|
|
|
+ } else if (strVal.length() == "yyyy-MM-dd HH:mm:ss".length()) {
|
|
|
+ format = "yyyy-MM-dd HH:mm:ss";
|
|
|
+ } else {
|
|
|
+ format = "yyyy-MM-dd HH:mm:ss.SSS";
|
|
|
+ }
|
|
|
+
|
|
|
+ SimpleDateFormat dateFormat = new SimpleDateFormat(format);
|
|
|
+ try {
|
|
|
+ return (Date) dateFormat.parse(strVal);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ throw new JSONException("can not cast to Date, value : " + strVal);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ longValue = Long.parseLong(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (longValue < 0) {
|
|
|
+ throw new JSONException("can not cast to Date, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ return new Date(longValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final java.sql.Date castToSqlDate(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Calendar) {
|
|
|
+ return new java.sql.Date(((Calendar) value).getTimeInMillis());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof java.sql.Date) {
|
|
|
+ return (java.sql.Date) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof java.util.Date) {
|
|
|
+ return new java.sql.Date(((java.util.Date) value).getTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ long longValue = 0;
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ longValue = ((Number) value).longValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ longValue = Long.parseLong(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (longValue <= 0) {
|
|
|
+ throw new JSONException("can not cast to Date, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ return new java.sql.Date(longValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final java.sql.Timestamp castToTimestamp(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Calendar) {
|
|
|
+ return new java.sql.Timestamp(((Calendar) value).getTimeInMillis());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof java.sql.Timestamp) {
|
|
|
+ return (java.sql.Timestamp) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof java.util.Date) {
|
|
|
+ return new java.sql.Timestamp(((java.util.Date) value).getTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ long longValue = 0;
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ longValue = ((Number) value).longValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ longValue = Long.parseLong(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (longValue <= 0) {
|
|
|
+ throw new JSONException("can not cast to Date, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ return new java.sql.Timestamp(longValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Long castToLong(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).longValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ return Long.parseLong(strVal);
|
|
|
+ } catch (NumberFormatException ex) {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to long, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Integer castToInt(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Integer) {
|
|
|
+ return (Integer) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).intValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String strVal = (String) value;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return Integer.parseInt(strVal);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to int, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final byte[] castToBytes(Object value) {
|
|
|
+ if (value instanceof byte[]) {
|
|
|
+ return (byte[]) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ return Base64.decodeFast((String) value);
|
|
|
+ }
|
|
|
+ throw new JSONException("can not cast to int, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final Boolean castToBoolean(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Boolean) {
|
|
|
+ return (Boolean) value;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof Number) {
|
|
|
+ return ((Number) value).intValue() == 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof String) {
|
|
|
+ String str = (String) value;
|
|
|
+ if (str.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ("true".equals(str)) {
|
|
|
+ return Boolean.TRUE;
|
|
|
+ }
|
|
|
+ if ("false".equals(str)) {
|
|
|
+ return Boolean.FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ("1".equals(str)) {
|
|
|
+ return Boolean.TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to int, value : " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static final <T> T castToJavaBean(Object obj, Class<T> clazz) {
|
|
|
+ return cast(obj, clazz);
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
+ public static final <T> T cast(Object obj, Class<T> clazz) {
|
|
|
+ if (obj == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == null) {
|
|
|
+ throw new IllegalArgumentException("clazz is null");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == obj.getClass()) {
|
|
|
+ return (T) obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (obj instanceof Map) {
|
|
|
+ if (clazz == Map.class) {
|
|
|
+ return (T) obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ return castToJavaBean(obj, clazz);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz.isArray()) {
|
|
|
+ if (obj instanceof Collection) {
|
|
|
+
|
|
|
+ Collection collection = (Collection) obj;
|
|
|
+ int index = 0;
|
|
|
+ Object array = Array.newInstance(clazz.getComponentType(), collection.size());
|
|
|
+ for (Object item : collection) {
|
|
|
+ Object value = cast(item, clazz.getComponentType());
|
|
|
+ Array.set(array, index, value);
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (T) array;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz.isAssignableFrom(obj.getClass())) {
|
|
|
+ return (T) obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == boolean.class || clazz == Boolean.class) {
|
|
|
+ return (T) castToBoolean(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == byte.class || clazz == Byte.class) {
|
|
|
+ return (T) castToByte(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ // if (clazz == char.class || clazz == Character.class) {
|
|
|
+ // return (T) castToCharacter(obj);
|
|
|
+ // }
|
|
|
+
|
|
|
+ if (clazz == short.class || clazz == Short.class) {
|
|
|
+ return (T) castToShort(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == int.class || clazz == Integer.class) {
|
|
|
+ return (T) castToInt(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == long.class || clazz == Long.class) {
|
|
|
+ return (T) castToLong(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == float.class || clazz == Float.class) {
|
|
|
+ return (T) castToFloat(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == double.class || clazz == Double.class) {
|
|
|
+ return (T) castToDouble(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == String.class) {
|
|
|
+ return (T) castToString(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == BigDecimal.class) {
|
|
|
+ return (T) castToBigDecimal(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == BigInteger.class) {
|
|
|
+ return (T) castToBigInteger(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == Date.class) {
|
|
|
+ return (T) castToDate(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == java.sql.Date.class) {
|
|
|
+ return (T) castToSqlDate(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz == java.sql.Timestamp.class) {
|
|
|
+ return (T) castToTimestamp(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (clazz.isEnum()) {
|
|
|
+ return (T) castToEnum(obj, clazz);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Calendar.class.isAssignableFrom(clazz)) {
|
|
|
+ Date date = castToDate(obj);
|
|
|
+ Calendar calendar;
|
|
|
+ if (clazz == Calendar.class) {
|
|
|
+ calendar = Calendar.getInstance();
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ calendar = (Calendar) clazz.newInstance();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new JSONException("can not cast to : " + clazz.getName(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ calendar.setTime(date);
|
|
|
+ return (T) calendar;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (obj instanceof String) {
|
|
|
+ String strVal = (String) obj;
|
|
|
+ if (strVal.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to : " + clazz.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
+ public static final <T> T castToEnum(Object obj, Class<T> clazz) {
|
|
|
+ try {
|
|
|
+ if (obj instanceof String) {
|
|
|
+ String name = (String) obj;
|
|
|
+ if (name.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (T) Enum.valueOf((Class<? extends Enum>) clazz, name);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (obj instanceof Number) {
|
|
|
+ int ordinal = ((Number) obj).intValue();
|
|
|
+
|
|
|
+ Method method = clazz.getMethod("values");
|
|
|
+ Object[] values = (Object[]) method.invoke(null);
|
|
|
+ for (Object value : values) {
|
|
|
+ Enum e = (Enum) value;
|
|
|
+ if (e.ordinal() == ordinal) {
|
|
|
+ return (T) e;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception ex) {
|
|
|
+ throw new JSONException("can not cast to : " + clazz.getName(), ex);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new JSONException("can not cast to : " + clazz.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+}
|