最近接手了一个项目,做了前后端分离,前端通过ajax的方式调用后端,后端返回json。
所以在项目中充斥这大量如下所示的代码
User user = UserService.getUser(id);
JSONObject jsonObject = new JSONObject();
if (null != user){
jsonObject.put("name", user.getName());
jsonObject.put("age" , user.getAge());
jsonObject.put("gender", user.getGender());
jsonObject.put("school", user.getSchool());
jsonObject.put("interesting", "foods");
jsonObject.put("city", "beijing");
...
...
...
}
这完全是体力活啊。。。
对于一个有强迫症,并且比较懒的程序媛,那自然不能忍啊,撸起袖子重构重构。
下面就是我的重构代码:
以User类为例:
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
public class User {
private String name;
private Integer age;
private String gender;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
/**
* filter sensitive fields
* @return
*/
public JSONObject toJsonObject() {
Util u1= new Util<>(this, null);
JSONObject object = u1.defaultWrap();
object.remove("password");
return object;
}
}
下面就是Util类,用了泛型和反射,将User对象的属性和额外添加的属性,组合到一个JSONObject里:
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Set;
public class Util {
private Bean bean;
private Object object;
public Util(Bean bean, Object object) {
this.bean = bean;
this.object = object;
}
public JSONObject wrap() {
try {
Method m = bean.getClass().getMethod("toJsonObject", new Class[] {});
if(null != m)
{
JSONObject jsonObject = (JSONObject) m.invoke(bean);
return combineData(jsonObject, (JSONObject) object);
}
} catch (Exception e) {
e.printStackTrace();
}
return defaultWrap();
}
public JSONObject defaultWrap() {
JSONObject jsonObject = new JSONObject();
Field[] fields = bean.getClass().getDeclaredFields();//拿到数据成员
//添加bean属性到jsonObject
for(Field f : fields){
try {
String firstLetter = f.getName().substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + f.getName().substring(1);
Method method = bean.getClass().getMethod(getter, new Class[] {});
if(null == method) {
continue;
}
Object value = (Object) method.invoke(bean);
jsonObject.put(f.getName(), value);
} catch (Exception e) {
e.printStackTrace();
}
}
return combineData(jsonObject, (JSONObject) object);
}
public JSONObject combineData(JSONObject container, JSONObject object) {
//添加extra object属性到jsonObject
if (null != object) {
Set keys = object.keySet();
for (String key : keys) {
container.put(key, object.getString(key));
}
}
return container;
}
}
以下就是调用方式:
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
public class Test {
@org.junit.Test
public void test() {
User user = new User();
user.setName("test01");
user.setAge(20);
user.setGender("girl");
user.setDate(new Date());
user.setPassword("fffffffffffffff");
JSONObject jsonObject = new JSONObject();
jsonObject.put("1", "ffffffff");
jsonObject.put("333", "dddddd");
Util u1 = new Util<>(user, jsonObject);
// Util u2 = new Util<>(user, null);
JSONObject obj = (JSONObject) u1.wrap();
System.out.println(obj);
}
}
因为对java了解的不是很深入,不知道这样实现会对性能有多大的影响。后面再持续优化吧。