javaBean 转json指定key-value个数

小弟面试碰到一个比计较恶心的要求,就是一个javaBean 可能有10个属性,转成json后通常也会有10个键值对,无论是否是null都会存在。现要求 转成json后 只能有3个有值的属性。怎么搞?java

我想到的就是反射面试

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<TestClass> cl = (Class<TestClass>) testClass.getClass();
        Field[] fields = cl.getDeclaredFields();
        System.out.println(fields.length);
        //来一个map 用于转换成json用
        Map<String,String> key_value = new HashMap<String,String>();

        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;
    }
}

其,主要思路就是:json

获取bean 的class对象,而后获取到全部的属性。this

根据get方法的命名规则,使用Field对象的getName方法拼接处get方法的名称。code

根据class对象和 get方法的名称 获取到对应get方法的method方法对象,调用该method方法的invoke方法执行get方法,获取指定field的值对象

封装到map中,转成json便可。get

 

若是要想随机将指定个数的属性封装成json,那么就要在遍历Fields时,就要随机取,在取出对应的value便可。string

相关文章
相关标签/搜索