首字母大寫的json串轉為javabean
阿新 • • 發佈:2019-01-02
需要的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());
}