-
Notifications
You must be signed in to change notification settings - Fork 1
/
CommonJsonUtil.java
136 lines (111 loc) · 4.4 KB
/
CommonJsonUtil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.cuiweiyou.xianke.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
/**
* JSON数据解析
* @author cuiweiyou
*/
public class CommonJsonUtil {
/**
* 解析json返回自动匹配的bean封装好的list集合<br/>
* 一旦上线此方法不再更改
* @param json json字串
* @return list集合
*/
private List<Object> analyzeJson2List(String json){
if (json == null || "".equals(json))
return null;
List<Object> result = new ArrayList<Object>();
return result;
}
/**
* 自动匹配json数据返回对应的bean<br/>
* 一旦上线,此方法不能再有任何修改
* @param json json字串
* @return 对应的bean封装体
*/
public Object analyzeJson2Bean(String json) {
if (json == null || "".equals(json))
return null;
String beanName = null; // Bean的类名,即JSON串中JSONObject的Key
JSONObject jobj = null;
try {
jobj = new JSONObject(json);
Iterator<String> keys = jobj.keys(); // 获取全部的key
while (keys.hasNext()) { // 遍历key
String key = keys.next(); // json串格式固定,得到key
beanName = key;
break;
}
} catch (JSONException e1) {
e1.printStackTrace();
}
if (beanName == null || "".equals(beanName))
return null;
try {
/** 反射,得到本条json串对应的Bean封装体 */
Class<?> clazz = Class.forName("com.cuiweiyou.analyze." + beanName);
/** 反射,得到Bean的全部成员属性 */
Field[] fields = clazz.getDeclaredFields(); // 公有私有属性都拿来
/** 构建Bean实例时用到的参数的类型集 */
Class[] types = new Class[fields.length];
/** 构建Bean实例时用到的参数集 */
Object[] parms = new Object[fields.length];
// json串中bean体对应的数据
JSONObject jcobj = jobj.getJSONObject(beanName);
// 提取Bean属性的值
for (int i = 0; i < types.length; i++) {
Class<?> type = fields[i].getType(); // 成员属性的类型,String、int、...
String fieldName = fields[i].getName(); // 成员属性的名称,name、age、...
Object fieldValue = jcobj.get(fieldName); // 根据成员名称,从json中提取对应的值。"北京"、23、...
String fieldType = type.getSimpleName();
System.out.println("变量类型:" + fieldType + ",变量名:" + fieldName + ", 变量值:" + fieldValue);
types[i] = type;
// 判断反射到的类的成员是什么类型。非集合类型的变量都好处理
if ("int".equals(type.getSimpleName()) || "Integer".equals(type.getSimpleName())) {
parms[i] = Integer.parseInt(fieldValue.toString());
} else if ("float".equals(type.getSimpleName()) || "Float".equals(type.getSimpleName())) {
parms[i] = Float.parseFloat(fieldValue.toString());
} else if ("short".equals(type.getSimpleName()) || "Short".equals(type.getSimpleName())) {
parms[i] = Short.parseShort(fieldValue.toString());
} else if ("long".equals(type.getSimpleName()) || "Long".equals(type.getSimpleName())) {
parms[i] = Long.parseLong(fieldValue.toString());
} else if ("double".equals(type.getSimpleName()) || "Double".equals(type.getSimpleName())) {
parms[i] = Double.parseDouble(fieldValue.toString());
} else if ("boolean".equals(type.getSimpleName()) || "Boolean".equals(type.getSimpleName())) {
parms[i] = Boolean.parseBoolean(fieldValue.toString());
} else {
parms[i] = fieldValue;
}
}
/** 发射,得到对应数量参数的构造方法 */
Constructor cstor = clazz.getDeclaredConstructor(types);
cstor.setAccessible(true);// 取消 Java 语言访问安全检查。此时可操作私有成员
/** 反射,通过构造方法创建Bean实例 */
return cstor.newInstance(parms);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}