net.sf.json将json字符串转换为json对象时 对象中的List属性均为空

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()方法,等等 那目标的类是哪里来的,我们可以发现keyname均是当前的JSONArraykey值,当然也就是我们的实体类对象的属性名了,用这个属性名去去了一个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 queryInfoList= JSONArray.toList(jsonArray,new QueryInfo(),jsonConfig);

那些个字符串就是我的那些List属性的字段了

你可能感兴趣的:(net.sf.json将json字符串转换为json对象时 对象中的List属性均为空)