1.發(fā)現問題
今天在使用JSONArray.toList(jsonArray,Object,jsonConfig)
來轉換一個比較復雜的json字符串時 發(fā)現轉換對象中的List
屬性的字段均為空,猜想是工具未將數據寫入。
2.大膽猜想
在查看轉換源碼時發(fā)現了一個比較奇特的類(其實也是受網上的文章的啟發(fā) 容我裝個逼),classmap
,我們可以發(fā)現對于JSONObject
對象中的JSONArray
是這么處理的
targetClass = findTargetClass(key, classMap);
argetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;
newRoot = jsonConfig.getNewBeanInstanceStrategy().newInstance(targetClass, (JSONObject)null);
List list = JSONArray.toList((JSONArray)value, newRoot, jsonConfig);
setProperty(root, key, list, jsonConfig);
這玩意是一個迭代啊勋陪,如果是JSONArray
一直調用JSONArray.toList()
方法,等等 那目標的類是哪里來的凄硼,我們可以發(fā)現key
和name
均是當前的JSONArray
的key
值史飞,當然也就是我們的實體類對象的屬性名了嗓违,用這個屬性名去去了一個class
然后給實例化了,這不就是我們上邊的JSONArray.toList(jsonArray,Object,jsonConfig)
中的Object嗎帅腌,大膽測試這就是屬性的對象;
在這個jsonConfig.getNewBeanInstanceStrategy().newInstance(targetClass, (JSONObject)null);
方法中發(fā)現一段話
Constructor c = target.getDeclaredConstructor(EMPTY_PARAM_TYPES);
c.setAccessible(true);
看起來實例化時需要一個無參的構造方法
3.解決問題
新建一個Map
將所有屬性為List的字段都加進去
-
key
-->屬性的名稱 -
value
-->屬性的類型(屬性的類.class)
然后
sonConfig jsonConfig=new JsonConfig();
jsonConfig.setClassMap(classMap);
全部代碼在此
JSONArray jsonArray=JSONArray.fromObject(zmString);
Map classMap=new HashMap();
classMap.put("pleInfos",PleInfo.class);
classMap.put("ownersInfos",OwnersInfo.class);
classMap.put("limitInfos",LimitInfo.class);
classMap.put("preInfos",PreInfo.class);
JsonConfig jsonConfig=new JsonConfig();
jsonConfig.setClassMap(classMap);
List<QueryInfo> queryInfoList= JSONArray.toList(jsonArray,new QueryInfo(),jsonConfig);
那些個字符串就是我的那些List屬性的字段了