近日,在項(xiàng)目中被一個(gè)問(wèn)題所困擾。就是在json轉(zhuǎn)換成實(shí)體類的時(shí)候時(shí)不時(shí)的會(huì)拋出一個(gè)類型轉(zhuǎn)換異常。
異常詳細(xì)信息為:
net.sf.ezmorph.bean.MorphDynaBean cannot be cast to (實(shí)體類的全路徑)
經(jīng)網(wǎng)上查閱了一些資料后發(fā)現(xiàn),如果實(shí)體類中涉及到復(fù)雜的數(shù)據(jù)類型的時(shí)候,這個(gè)異常就會(huì)暴露出來(lái)。
實(shí)體類中所涉及到的數(shù)據(jù)類型有兩種:
分別有Stirng 和 list集合 集合的泛型則是另外一個(gè)實(shí)體類。廢話不多說(shuō)直接上代碼:
//實(shí)體類一
public class GoodsInfo {
private String name;
private List<Price> priceList;
//gei,set方法省略
}
//實(shí)體類二
public class Price {
private Integer price;
private String name;
//get,set方法省略
}
測(cè)試過(guò)程:
在一個(gè)main方法中去兩個(gè)類里面進(jìn)行初始化:
public static void main(String[] args) {
GoodsInfo info = new GoodsInfo();
Price price = new Price();
Price price1 = new Price();
List<Price> list = new ArrayList<>();
price .setPrice(30);
price.setName("CCTV5");
price1 .setPrice(30);
price1.setName("CCTV5");
list.add(price);
list.add(price1);
info.setId("1434141");
info.setName("choufei");
info.setPriceList(list);
JSONObject json = JSONObject.fromObject(info);
System.out.println(json);
GoodsInfo info1 = new GoodsInfo();
info1 = (GoodsInfo) JSONObject.toBean(json, GoodsInfo.class);
Price pc = info1.getPriceList().get(0);
System.out.println(pc.getPrice());
}
當(dāng)運(yùn)行此main方法的時(shí)候就會(huì)拋出以下異常:
Exception in thread "main" java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.lty.pilipala.entity.Price
at com.lty.pilipala.test.Test.main(Test.java:42)
解決方法:
//在main中從json轉(zhuǎn)換對(duì)象的時(shí)候用map集合進(jìn)行約束
JSONObject json = JSONObject.fromObject(info);
System.out.println(json);
GoodsInfo info1 = new GoodsInfo();
Map<String, Object> map = new HashMap<>();
map.put("priceList", Price.class);//注意,priceList就是實(shí)體類里面的參數(shù)名稱。
info1 = (GoodsInfo) JSONObject.toBean(json, GoodsInfo.class, map);
System.out.println(info1.getPriceList().get(0).getPrice());
輸出結(jié)果:
30
2017-11-23 上海 晴