package org.voovan.tools.json;
import org.voovan.tools.TObject;
import org.voovan.tools.TString;
import org.voovan.tools.reflect.TReflect;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* JSON打包类
*
* @author helyho
* <p>
* Voovan Framework.
* WebSite: https://github.com/helyho/Voovan
* Licence: Apache v2 License
*/
public class JSONEncode {
/**
* 分析自定义对象为JSON字符串
*
* @param object 自定义对象
* @return JSON字符串
* @throws ReflectiveOperationException
*/
private static String complexObject(Object object) throws ReflectiveOperationException {
return mapObject(TReflect.getMapfromObject(object));
}
/**
* 分析Map对象为JSON字符串
*
* @param mapObject map对象
* @return JSON字符串
* @throws ReflectiveOperationException
*/
private static String mapObject(Map<?, ?> mapObject) throws ReflectiveOperationException {
String mapString = "{";
StringBuilder ContentStringBuilder = new StringBuilder();
String ContentString = null;
Object[] keys = mapObject.keySet().toArray();
for (Object mapkey : keys) {
Object key = fromObject(mapkey);
String Value = fromObject(mapObject.get(mapkey));
ContentStringBuilder.append(key);
ContentStringBuilder.append(":");
ContentStringBuilder.append(Value);
ContentStringBuilder.append(",");
}
ContentString = ContentStringBuilder.toString();
if (!ContentString.trim().isEmpty()){
ContentString = ContentString.substring(0, ContentString.length() - 1);
}
mapString = mapString + ContentString + "}";
return mapString;
}
/**
* 分析Collection对象为JSON字符串
*
* @param listObject List对象
* @return JSON字符串
* @throws ReflectiveOperationException
*/
private static String CollectionObject(List<Object> listObject) throws ReflectiveOperationException {
return arrayObject(listObject.toArray());
}
/**
* 分析Array对象为JSON字符串
*
* @param arrayObject Array对象
* @throws ReflectiveOperationException
* @return JSON字符串
*/
private static String arrayObject(Object[] arrayObject) throws ReflectiveOperationException {
String arrayString = "[";
String ContentString = "";
StringBuilder ContentStringBuilder = new StringBuilder();
for (Object object : arrayObject) {
String Value = fromObject(object);
ContentStringBuilder.append(Value);
ContentStringBuilder.append(",");
}
ContentString = ContentStringBuilder.toString();
if (!ContentString.trim().isEmpty()) {
ContentString = ContentString.substring(0, ContentString.length() - 1);
}
arrayString = arrayString + ContentString + "]";
return arrayString;
}
/**
* 将对象转换成JSON字符串
*
* @param object 要转换的对象
* @return 类型:String 对象对应的JSON字符串
* @throws ReflectiveOperationException 反射异常
*/
@SuppressWarnings("unchecked")
public static String fromObject(Object object) throws ReflectiveOperationException {
String value = null;
if (object == null) {
value = "null";
} else if (object instanceof Map) {
Map<Object, Object> mapObject = (Map<Object, Object>) object;
value = mapObject(mapObject);
} else if (object instanceof Collection) {
List<Object> listObject = TObject.cast(object);
value = CollectionObject(listObject);
} else if (object.getClass().isArray()) {
Object[] arrayObject = TObject.cast(object);
value = arrayObject(arrayObject);
} else if (object instanceof Integer || object instanceof Float ||
object instanceof Double || object instanceof Boolean ||
object instanceof Long || object instanceof Short) {
value = object.toString();
} else if (TReflect.isBasicType(object.getClass())) {
//这里这么做的目的是方便 js 中通过 eval 方法产生 js 对象
String strValue = TString.convertEscapeChar(object.toString());
value = "\"" + strValue + "\"";
} else {
value = complexObject(object);
}
return value;
}
}