小弟面试碰到一个比计较恶心的要求,就是一个javaBean 可能有10个属性,转成json后一般也会有10个键值对,不管是不是null都会存在。现要求 转成json后 只能有3个有值的属性。怎么搞?
我想到的就是反射
package com.wisely;
import net.sf.json.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* DES: 将非null 的属性,转成json null的属性,在json中看不到
* Created by Reynole-白
* Date: 2017/8/29 16:37
*/
public class TestClass {
private String name;
private String sex;
private int age;
private String adress;
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String sysMsg(){
return "我是sysMsg方法";
}
public static void main(String[] args) throws Exception {
TestClass testClass = new TestClass();
testClass.setName("i am TestClass class");
testClass.setAge(10);
testClass.setSex("girl");
Class cl = (Class) testClass.getClass();
Field[] fields = cl.getDeclaredFields();
System.out.println(fields.length);
//来一个map 用于转换成json用
Map key_value = new HashMap();
for(Field field : fields){
Object object = getValueByFieldName(field.getName(),testClass);
if(null != object){
System.out.println(object.toString());
//将key-value 添加到map
key_value.put(field.getName(),object.toString());
}
}
JSONObject json = JSONObject.fromObject(key_value);
System.out.println(json.toString());
}
public static Object getValueByFieldName(String fieldName,Object object) throws Exception {
//一般get方法属性名开头字母都大写
String firstLetter = fieldName.substring(0, 1).toUpperCase();
//拼接成getter方法名
String getter = "get" + firstLetter + fieldName.substring(1);
//获取对应get方法下面两个方法使用哪个都行
Method method = object.getClass().getMethod(getter,null);
// Method method = object.getClass().getMethod(getter,new Class[]{});
//执行该get方法,后面的参数给一个空就行
Object value = method.invoke(object,null);
// method.invoke(object,new Object[]{});
return value;
}
}
其,主要思路就是:
获取bean 的class对象,然后获取到所有的属性。
根据get方法的命名规则,使用Field对象的getName方法拼接处get方法的名称。
根据class对象和 get方法的名称 获取到对应get方法的method方法对象,调用该method方法的invoke方法执行get方法,获取指定field的值
封装到map中,转成json即可。
如果要想随机将指定个数的属性封装成json,那么就要在遍历Fields时,就要随机取,在取出对应的value即可。