需要的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<String, Class<?>> getListType(Class<?> clazz) throws ClassNotFoundException{
Map<String, Class<?>> 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<String,Class<?>> 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<String, Class<?>> 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<Address> 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<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
}
package test;
import java.util.List;
public class Address {
private String name;
private List<House> houseList;
public List<House> getHouseList() {
return houseList;
}
public void setHouseList(List<House> 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());
}