此篇讲解保存json数据的小技巧。
推荐:fastjson或gson的使用。
使用JSONObject和JSONArray解析
实例:
{"code":"1","name":"kongge","age":22,"date":[{"userId":"123","userPwd":"456"},{"userId":"321","userPwd":"789"}]} // @1 {"code":"1","name":"ggg","age":23,"date":{"like":"game","fruit":"apple"}} // @2 {"code":"1","name":"ggg","age":24,"date":{"sex":"man","like":"play","fruit":"banana"}} // @3 {"code":"0","error":"I'm sorry!"} // @4规则:此类json数据固定有code字段,当code=1时,固定有name,age和data字段,但是data字段有时候会是数组对象,有时候会是单个对象,并且每一种json数据里面的data对象里面的字段不一定一样。当code=0时,有固定字段error;
问题:怎么解析和保存这些数据?
一般解决方法:1.每种json数据写一个实体类,字段名一一对应。2.每种json数据写一个解析,然后保存到实体类中。
缺陷:如果json数据里data字段里面的字段种类很多且大多各不相同,若有20条,就得写二十个实体类加二十个解析函数,工作量大效率低。
小结:上述一类json有很多共同点,其实只需要用一个实体类和一个解析函数就可以了。
改进方法和技巧:
1.既然code和name,age,error是固定的,只是有或没有,不妨将其全加入Mode类中。解析时先判断code是否为1,区分对待赋值。
2.data字段比较特殊,因为其有可能只是单纯的JSONObject,也有可能是JSONArray,里面所包含的字段名也不一定一样,这时,可以将data数组看成List<Map<String, Object>>,动态获取到Key值,然后获取Key对应的value,然后放入map中,最后放入list中。
3.若data只是JSONObject,而非数组,也可以将其看做List<Map<String, Object>>,只是此list中只有一条数据罢了。
问题:怎么动态获取key值?
答:JSONObject 对象提供了keys()方法,此方法返回的是一个迭代器。解析到data时,创建list对象,每解析数组里面的一个元素,就创建map,之后加入list中。
Iterator iterator = joData.keys(); // joData是JSONObject对象 while(iterator.hasNext()){ String key = iterator.next() + ""; hashMap.put(key,joData.get(key)); } arrayList.add(hashMap);问题:怎么区分data是JSONObject 还是 JSONArray?
答:我想了个偏方,当data的value是数组时,即会以"["开头,所以用startWith("[")判断即可。若是,就将data的value转化为JSONArray,否则转化为JSONObject 。这种方式也不靠谱,当数据是“[”开头的,并且以“]”结尾的,这种就无法判断了。
问题:怎么获取值?
答:遍历list,根据已知key获取value;
小结:其实就连最外层的都可以看做List<Map<String, Object>>的形式,此篇仅供参考,