JSONObject转实体
JSONObject主要分为net.sf.json.JSONObject和com.alibaba.fastjson.JSONObject。
其实这两个JSONObject常用的功能都有,但是用法是不一样的。
JSON字符串使用net.JSONObject转实体主要用到的方法:
Student bean = (Student ) JSONObject.toBean(JSONObject.fromObject(o), Student .class);
JSON字符串使用fastjson转实体用的的方法:
//JSON字符串转换成Java对象
Student student1 = JSONObject.parseObject(stuString, Student.class);
普通方法将JSON字符串转为java对象(通用)
只需要将下列代码直接复制到一个工具类中(我是复制到我的工具类Utils中),然后直接调用就可以转为想要的对象
例:
Student student= Utils.jsonToEntity(object, Student .class);
这是一个通用的方法。
public static final char UNDERLINE_CHAR = '_';
/**
* 驼峰转下划线大写
*
* @param camelStr
* @return
* @Author xlq
*/
public static String camelUnderline(String camelStr) {
if (org.apache.commons.lang.StringUtils.isEmpty(camelStr)) {
return org.apache.commons.lang.StringUtils.EMPTY;
}
int len = camelStr.length();
StringBuilder strb = new StringBuilder(len + len >> 1);
for (int i = 0; i < len; i++) {
char c = camelStr.charAt(i);
if (Character.isUpperCase(c)) {
strb.append(UNDERLINE_CHAR);
strb.append(Character.toLowerCase(c));
} else {
strb.append(c);
}
}
return strb.toString().toUpperCase();
}
/**
* 将JSON对象中的数据封装到JavaBean中,带下划线的key
*
* @param jsonObject
* @param classType
* @param <T>
* @return
* @throws Exception
* @Author xlq
*/
public static <T> T jsonToEntity(JSONObject jsonObject, Class<T> classType) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//采用反射机制创建对象
T entity = classType.newInstance();
//获取对象字节码信息,不要Object的属性
BeanInfo beanInfo = Introspector.getBeanInfo(classType, Object.class);
//获取entity对象中的所有属性
PropertyDescriptor[] list = beanInfo.getPropertyDescriptors();
Iterator keys = jsonObject.keys();
while (keys.hasNext()) {
String next = (String) keys.next();
for (PropertyDescriptor pd : list) {
//获取属性名
String key = pd.getName();
if (next.equalsIgnoreCase(key) || next.equalsIgnoreCase(camelUnderline(key)) || key.toLowerCase().equals(next.replace("_", "").toLowerCase())) {
//获取属性值
Class<?> propertyType = pd.getPropertyType();
if ("int".equals(propertyType.toString()) || "class java.lang.Integer".equals(propertyType.toString())) {
String string = jsonObject.getString(next);
if (!org.apache.commons.lang.StringUtils.isEmpty(string) && !"".equals(string)) {
Integer value = Integer.valueOf(string);
pd.getWriteMethod().invoke(entity, value);
}
break;
} else if ("class java.math.BigDecimal".equals(propertyType.toString())) {
String string = jsonObject.getString(next);
if (!org.apache.commons.lang.StringUtils.isEmpty(string) && !"".equals(string)) {
BigDecimal value = BigDecimal.valueOf(Double.parseDouble(string));
pd.getWriteMethod().invoke(entity, value);
}
break;
} else if ("class java.util.Date".equals(propertyType.toString())) {
String string = jsonObject.getString(next);
if (!org.apache.commons.lang.StringUtils.isEmpty(string) && !"".equals(string)) {
Date parse = sdf.parse(string);
pd.getWriteMethod().invoke(entity, parse);
}
break;
} else {
if (!"tmark".equalsIgnoreCase(next) && !"lg_lock".equalsIgnoreCase(next)) {
String value = jsonObject.getString(next);
pd.getWriteMethod().invoke(entity, value);
break;
}
}
}
}
}
return entity;
}