那这种情况的解析方法
1 String jsonMyBean3 = "{'mybean2List':[{'id':'1','name':'mybean3'}],'mybean2Map':{'1':{'id':'2','name':'mybean3'}}}"; 2 Map classMap2 = new HashMap(); 3 classMap2.put("mybean2List", MyBean2.class); 4 // classMap2.put("mybean2Map", Map.class); 5 MyBean3 mybean3 = (MyBean3) JSONObject.toBean( 6 JSONObject.fromObject(jsonMyBean3), MyBean3.class, classMap2); 7 System.out.println("-------------" 8 + mybean3.getMybean2List().getClass() + "|" 9 + mybean3.getMybean2Map().getClass() + "|"); 10 // List<MyBean2> mybean2List = mybean3.getMybean2List(); 11 Morpher dynaMorpher = new BeanMorpher(MyBean2.class, 12 JSONUtils.getMorpherRegistry()); 13 MorpherRegistry morpherRegistry = new MorpherRegistry(); 14 morpherRegistry.registerMorpher(dynaMorpher); 15 List output = new ArrayList(); 16 for (Iterator i = mybean3.getMybean2List().iterator(); i.hasNext();) { 17 Object morph = morpherRegistry.morph(MyBean2.class, i.next()); 18 output.add(morph); 19 } 20 mybean3.setMybean2List(output); 21 // 打印结果 22 for (MyBean2 object : mybean3.getMybean2List()) { 23 System.out.println("特殊转换list——" + object.getName()); 24 } 25 // Map 26 morpherRegistry.registerMorpher(dynaMorpher); 27 Map outputMap = new HashMap(); 28 for (Map.Entry outMap : mybean3.getMybean2Map().entrySet()) { 29 Object value = outMap.getValue(); 30 outputMap.put(outMap.getKey(), 31 morpherRegistry.morph(MyBean2.class, value)); 32 } 33 mybean3.setMybean2Map(outputMap); 34 // 输出部分结果 35 for (Map.Entry<String, MyBean2> bean2Map : mybean3.getMybean2Map() 36 .entrySet()) { 37 System.out.println("特殊转换map——" + bean2Map.getKey() + ":" 38 + bean2Map.getValue()); 39 } 40 }结果
1 特殊转换list——mybean3十二月 21, 2014 3:14:58 下午 net.sf.ezmorph.bean.BeanMorpher morph 2 信息: Property 'com.r.json.jsonlib.MyBean2.class' has no write method. SKIPPED. 3 4 十二月 21, 2014 3:14:58 下午 net.sf.ezmorph.bean.BeanMorpher morph 5 信息: Property 'com.r.json.jsonlib.MyBean2.class' has no write method. SKIPPED. 6 特殊转换map——1:com.r.json.jsonlib.MyBean2@282c1e2elist中包含自定义对象,可以将自定义类型放到一个map里,tobean()方法里多一个classMap参数,但经过测试这个参数没有也是可以的。
这包不方便的地方,这个里面的自定义类型需要自己手动转换,用例子中的方法。结果中打印里一些信息,“no write method”,经过看源码,是反射类属性时,类中的class对象没有write方法,不影响解析。
总结:从json解析java对象,一般的内容使用JSONObject或JSONArray的toBean方法即可,若是 自定义类型,使用带class对象参数的toBean方法,,若是list,map中包含自定义类型,则在使用toBean方法后,要手动转换 DynaBean类型到实际类型。