Android json解析动态获取key以及解析技巧

此篇讲解保存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>>的形式,此篇仅供参考,

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值