首字母大写的json串转为javabean

需要的jar包:
依赖jar:
commons-beanutils-core-1.8.0.jar
commons-collections-3.2.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
ezmorph-lib-2.2.2.jar
json-lib-2.2.2.jar

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.PropertyNameProcessor;

public class JsonToBean {

    /**
     * 利用反射获取属性中list类的属性名和泛型类型
     * @param clazz
     * @return
     * @throws ClassNotFoundException
     */
    public  static  Map> getListType(Class clazz) throws ClassNotFoundException{
        Map> classmap = new HashMap<>();

        //通过反射获得list类的属性名和泛型类型
        Class target = Class.forName(clazz.getName());
        Field[] fields = target.getDeclaredFields();
        for(Field f : fields){
            //判断是否为list类
            if(f.getType().isAssignableFrom(List.class)){
                //属性名
                String fieldName = f.getName();
                Type fc = f.getGenericType();
                if(fc instanceof ParameterizedType){
                    ParameterizedType pt = (ParameterizedType) fc;
                    //泛型类型
                    Class genericClazz = (Class)pt.getActualTypeArguments()[0]; //【4】 得到泛型里的class类型对象。

                    classmap.put(fieldName, genericClazz);
                    //递归调用此方法,获取属性类中的list
                    classmap.putAll(getListType(genericClazz));

                }

            }
        }
        return classmap;
    }


    /**
     * 将json转换为特定的类
     * @param clazz 目标类
     * @param jsonString json字符串
     * @return  
     * @throws ClassNotFoundException
     */
    public static Object getJson(Class clazz,String jsonString) throws ClassNotFoundException{
        JsonConfig config=new JsonConfig();
        config.setRootClass(clazz);
        Map> classMap = getListType(clazz);

        PropertyNameProcessor lowerCasePropertyNameProcessor = new PropertyNameProcessor() {
            @Override
            public String processPropertyName(Class aClass, String s) {
                return s.substring(0,1).toLowerCase() + s.substring(1);
            }
        };

        config.setClassMap(classMap);

        config.registerPropertyNameProcessor(clazz, lowerCasePropertyNameProcessor);
        for(Entry> entry : classMap.entrySet()){
            config.registerPropertyNameProcessor(entry.getValue(), lowerCasePropertyNameProcessor);
        }

        JSONObject jsonObject = JSONObject.fromObject(jsonString);
        Object bean = JSONObject.toBean(jsonObject, config);
        return bean;
    }
}

最后只需要将getJson方法返回的object类强转为目标类型即可。

测试用例:

package test;

import java.util.List;

/**
 * Created by Administrator on 2017/5/6.
 */
public class Person {
    private int id;
    private String name;
    private List
addresses; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List
getAddresses() { return addresses; } public void setAddresses(List
addresses) { this.addresses = addresses; } } package test; import java.util.List; public class Address { private String name; private List houseList; public List getHouseList() { return houseList; } public void setHouseList(List houseList) { this.houseList = houseList; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package test; public class House { private String street; private String houseNum; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getHouseNum() { return houseNum; } public void setHouseNum(String houseNum) { this.houseNum = houseNum; } } /* main方法 */ public static void main(String[] args) throws ClassNotFoundException { Demo demo = new Demo(); String jsonString = "{\"Addresses\":[{\"HouseList\":[{\"HouseNum\":\"houseNum\",\"Street\":\"streetName\"}],\"Name\":\"add1\"}],\"Id\":1,\"Name\":\"p\"}"; Object json = JsonToBean.getJson(Person.class, jsonString); Person p = (Person) json; System.out.println(p.getAddresses().get(0).getHouseList().get(0).getHouseNum()); }

你可能感兴趣的:(其他)