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属性的字段了










网友评论