需求背景:项目中原来是通过fastJson 进行转换的,但是这个方法在vivo51上会卡死手机,最后导致OOM。 没办法只能根据项目自己进行封装。
实现思路:遍历对象属性,进行拼接,普通(String,int,booble等)直接放到HashMap中,List拼接成json串,作为value放到HashMap中.只有第一层的才会放到hashMap中,其他都拼接为json串。
核心方法:
Field[] declaredField= obj.getClass().getDeclaredFields();
for(int i=0;i<declaredField.length;i++){
Field field=declaredField[i];
field.setAccessible(true);//设置可获取值
String name =field.getName();//获取字段名称
Object obj =field.get(obj);//获取字典对应的值 这个obj 对应传进来的 obj
String typeName = field.getGenericType().toString();//获取值的类型
if(type.equals("class java.lang.String")){ //如果type是类类型,则前面包含"class ",后面跟类名
...
}
if(type.equals("class java.lang.Integer")){
...
}
if(type.equals("class java.lang.Short")){
...
}
if(type.equals("class java.lang.Double")){
...
}
if(type.equals("class java.lang.Boolean")){
...
}
if(type.equals("class java.util.Date")){
...
}
if(type.contains("java.util.List")){//匹配List
...
}
}
具体实现代码 只测试了两层 及: 带一层list的数据提交,未测 list中有list的情况
/**
* 将对象转为Map
*
* @return
*/
public static HashMap<String, String> covertObj2Map(Object obj) {
HashMap<String, String> hashMap = new HashMap<>();
try {
/*获取所u 声明字段*/
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field declaredField = declaredFields[i];
/*可获取值,不加这个可能获取不到值*/
declaredField.setAccessible(true);
String name = declaredField.getName();
/*获取字段对应的值*/
Object value = declaredField.get(obj);
if (value != null) {
String typeName = declaredField.getGenericType().toString();
/*如果是List, 其他统一处理*/
if (typeName.contains("java.util.List")) {
List list = (List) value;
hashMap.put(name, getJSonStr(list));
} else {
hashMap.put(name, String.valueOf(value));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return hashMap;
}
/**
* 拼接 list 中的数据为jsonStr
*/
private static String getJSonStr(List list) throws IllegalAccessException {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < list.size(); i++) {
Object item = list.get(i);
if (item instanceof List) {
sb.append(getJSonStr(list));
} else {
Field[] declaredFields = item.getClass().getDeclaredFields();
sb.append("{");
for (int m = 0; m < declaredFields.length; m++) {
Field declaredField = declaredFields[m];
declaredField.setAccessible(true);
String name = declaredField.getName();
Object value = declaredField.get(item);
if (value != null) {
String typeName = declaredField.getGenericType().toString();
if (typeName.contains("java.util.List")) {
sb.append(getJSonStr((List) value));
} else {
sb.append(name).append(":").append(value);
if (m < declaredFields.length - 1) {
sb.append(",");
}
}
}
}
sb.append("}");
if (i < list.size() - 1) {
sb.append(",");
}
}
}
sb.append("]");
return sb.toString();
}
网友评论