package com.quark.common;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
/**
* @author howe
*
*/
public class JsonUtil {
/**
* JSONObject对象转JavaBean
*
* @param json JSONObject
* @param cls JavaBean的class
* @return 转换结果(异常情况下返回null)
*/
public static Object jsonToBean(JSONObject json, Class cls) {
Object obj = null;
try {
obj = cls.newInstance();
// 取出Bean里面的所有方法
Method[] methods = cls.getMethods();
for (int i = 0; i < methods.length; i++) {
// 取出方法名
String methodName = methods[i].getName();
// 取出方法的类型
Class[] clss = methods[i].getParameterTypes();
if (clss.length != 1) {
continue;
}
// 若是方法名不是以set开始的则退出本次循环
if (methodName.indexOf("set") < 0) {
continue;
}
// 类型
String type = clss[0].getSimpleName();
String key = methodName.substring(3, 4).toLowerCase()
+ methodName.substring(4);
// 如果map里有该key
if (json.has(key) && json.get(key) != null) {
// System.out.println(key+"值:"+json.get(key));
setValue(type, json.get(key), methods[i], obj);
}
}
} catch (Exception ex) {
ex.printStackTrace();
Log.i("error", "jsonToBean转化失败");
}
return obj;
}
/**
* 根据key从JSONObject对象中取得对应值
*
* @param json
* @param key
* @return
* @throws JSONException
*/
public static String getString(JSONObject json, String key)
throws JSONException {
String retVal = null;
if (json.isNull(key)) {
retVal = "";
} else {
retVal = json.getString(key);
}
return retVal;
}
/**
* 给JavaBean的每个属性设值
*
* @param type
* @param value
* @param method
* @param bean
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws ParseException
*/
private static void setValue(String type, Object value, Method method,
Object bean) {
// System.out.println("類型"+type+" 值:"+value.toString());
if (value != null && !"".equals(value)) {
try {
if ("String".equals(type)) {
if (value.toString().equals("null")) {
value = "";
}
method.invoke(bean, new Object[] { value });
} else if ("int".equals(type) || "Integer".equals(type)) {
method.invoke(bean,
new Object[] { new Integer("" + value) });
} else if ("double".equals(type) || "Double".equals(type)) {
method.invoke(bean, new Object[] { new Double("" + value) });
} else if ("float".equals(type) || "Float".equals(type)) {
method.invoke(bean, new Object[] { new Float("" + value) });
} else if ("long".equals(type) || "Long".equals(type)) {
method.invoke(bean, new Object[] { new Long("" + value) });
} else if ("int".equals(type) || "Integer".equals(type)) {
method.invoke(bean,
new Object[] { new Integer("" + value) });
} else if ("boolean".equals(type) || "Boolean".equals(type)) {
method.invoke(bean,
new Object[] { Boolean.valueOf("" + value) });
} else if ("BigDecimal".equals(type)) {
method.invoke(bean, new Object[] { new BigDecimal(""
+ value) });
} else if ("Date".equals(type)) {
Class dateType = method.getParameterTypes()[0];
if ("java.util.Date".equals(dateType.getName())) {
java.util.Date date = null;
if ("String".equals(value.getClass().getSimpleName())) {
String time = String.valueOf(value);
String format = null;
if (time.indexOf(":") > 0) {
if (time.indexOf(":") == time.lastIndexOf(":")) {
format = "yyyy-MM-dd H:mm";
} else {
format = "yyyy-MM-dd H:mm:ss";
}
} else {
format = "yyyy-MM-dd";
}
SimpleDateFormat sf = new SimpleDateFormat();
sf.applyPattern(format);
date = sf.parse(time);
} else {
date = (java.util.Date) value;
}
if (date != null) {
method.invoke(bean, new Object[] { date });
}
} else if ("java.sql.Date".equals(dateType.getName())) {
Date date = null;
if ("String".equals(value.getClass().getSimpleName())) {
String time = String.valueOf(value);
String format = null;
if (time.indexOf(":") > 0) {
if (time.indexOf(":") == time.lastIndexOf(":")) {
format = "yyyy-MM-dd H:mm";
} else {
format = "yyyy-MM-dd H:mm:ss";
}
} else {
format = "yyyy-MM-dd";
}
SimpleDateFormat sf = new SimpleDateFormat();
sf.applyPattern(format);
date = new Date(sf.parse(time).getTime());
} else {
date = (Date) value;
}
if (date != null) {
method.invoke(bean, new Object[] { date });
}
}
} else if ("Timestamp".equals(type)) {
Timestamp timestamp = null;
if ("String".equals(value.getClass().getSimpleName())) {
String time = String.valueOf(value);
String format = null;
if (time.indexOf(":") > 0) {
if (time.indexOf(":") == time.lastIndexOf(":")) {
format = "yyyy-MM-dd H:mm";
} else {
format = "yyyy-MM-dd H:mm:ss";
}
} else {
format = "yyyy-MM-dd";
}
SimpleDateFormat sf = new SimpleDateFormat();
sf.applyPattern(format);
timestamp = new Timestamp(sf.parse(time).getTime());
} else {
timestamp = (Timestamp) value;
}
if (timestamp != null) {
method.invoke(bean, new Object[] { timestamp });
}
} else if ("byte[]".equals(type)) {
method.invoke(bean,
new Object[] { new String("" + value).getBytes() });
}
// carson add at 2015-5-6 14:00 解析jsonarray成bean
else if ("JSONArray".equals(type)) {
method.invoke(bean,
new Object[] { new JSONArray(value.toString()) });
} else if ("JSONObject".equals(type)) {
method.invoke(bean,
new Object[] { new JSONObject(value.toString()) });
}
} catch (Exception ex) {
ex.printStackTrace();
Log.i("error", "setValue转化失败");
}
}
}
/**
* 将Model转换成JSONObject
*/
@SuppressWarnings("unchecked")
public static JSONObject coverModelToJSONObject(Object o) throws Exception {
JSONObject json = new JSONObject();
Class clazz = o.getClass();
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
json.put(f.getName(), invokeMethod(clazz, f.getName(), o));
}
return json;
}
/**
* 将list转换成JSONArray
*/
public static JSONArray coverModelToJSONArray(List list) throws Exception {
JSONArray array = null;
if (list.isEmpty()) {
return array;
}
array = new JSONArray();
for (Object o : list) {
array.put(coverModelToJSONObject(o));
}
return array;
}
@SuppressWarnings("unchecked")
private static Object invokeMethod(Class c, String fieldName, Object o) {
String methodName = fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Method method = null;
try {
method = c.getMethod("get" + methodName);
return method.invoke(o);
} catch (Exception e) {
e.printStackTrace();
Log.i("error", "invokeMethod转化失败");
return "";
}
}
}