1.发现问题
今天在使用JSONArray.toList(jsonArray,Object,jsonConfig)
来转换一个比较复杂的json字符串时 发现转换对象中的List
属性的字段均为空,猜想是工具未将数据写入。
2.大胆猜想
在查看转换源码时发现了一个比较奇特的类(其实也是受网上的文章的启发 容我装个逼),classmap
,我们可以发现对于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()
方法,等等 那目标的类是哪里来的,我们可以发现key
和name
均是当前的JSONArray
的key
值,当然也就是我们的实体类对象的属性名了,用这个属性名去去了一个class
然后给实例化了,这不就是我们上边的JSONArray.toList(jsonArray,Object,jsonConfig)
中的Object吗,大胆测试这就是属性的对象;
在这个jsonConfig.getNewBeanInstanceStrategy().newInstance(targetClass, (JSONObject)null);
方法中发现一段话
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属性的字段了