一起Talk Android吧(第三百四十八回:解析JSON数组三)

本文详细介绍了在Android中如何解析包含自定义对象和嵌套数组的复杂JSON数据,通过递归方式解析JSON对象和数组,展示了具体的Java代码示例,并给出了程序的运行结果。

各位看官们,大家好,上一回中咱们说的是Android中解析JSON数组的例子,这一回中咱们继续介绍此例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在上一章回中介绍了如何解析普通数组,本章回中将介绍如何解析复杂数组.复杂JSON数组具有以下特征:
数组中的成员是自定义的
成员包含普通标量,JSONObject对象,JSON数组,
与简单数组相比,复杂数组多了JSON数组类型的成员,就是说在数组中嵌套了一个数组,下面是一个复杂数组的示例。

["id",23,{"id":11,"name":"jam","price":3.5,"path":"a/b/c"},["id",23,{"id":11,"name":"jam","price":3.5,"path":"a/b/c"}]]

解析这样的复杂数组涉及三种解析:普通标量解析、JSON对象解析、JSON数组解析。我们使用递归的思路进行解析,具体操作如下:

  • 如果数组成员的类型是JSON对象就按照JSON对象的方式进行解析;
  • 如果数组成员的类型是JSON数组就按照JSON数组的方式进行解析;
  • 如果数组成员的类型是普通标量,直接获取出来就可以;

在解析JSON数组时递归解析数组自己,因为数组中嵌套了数组。这种嵌套自身的JSON,不能生成JavaBean类,因为类的成员相同,只是嵌套而已下面是具体的示例代码,请大家参考:

   private void parseJsonArrayByJavaNative() {
       String jsonString = "[\"id\",23,{\"id\":11,\"name\":\"jam\",\"price\":3.5,\"path\":\"a/b/c\"},[\"id\",23,{\"id\":11,\"name\":\"jam\",\"price\":3.5,\"path\":\"a/b/c\"}]]";

       try {
           JSONArray jsonArray = new JSONArray(jsonString);
           for(int i=0; i<jsonArray.length(); ++i) {
               //如果数组中的内容是JSONObject,就按照JSONObject的方式解析
               if(jsonArray.get(i) instanceof JSONObject) {
                   try {
                       JSONObject jsonObject = jsonArray.getJSONObject(i);
                       JsonBeanType jsonBeanObject = new JsonBeanType();

                       jsonBeanObject.setId(jsonObject.optInt("id"));
                       jsonBeanObject.setName(jsonObject.optString("name"));
                       jsonBeanObject.setPrice(jsonObject.optDouble("price"));
                       jsonBeanObject.setPath(jsonObject.getString("path"));

                       Log.d(TAG, "parseJsonArrayByJavaNative: "+jsonBeanObject.toString());
                   } catch (JSONException e) {
                       Log.d(TAG, "parseJsonArrayByJavaNative: Exception: "+e);
                   }
               //如果数组中的内容是JSONArray,就按照JSONArray的方式解析,相当于递归调用自已
               }else if(jsonArray.get(i) instanceof JSONArray) {
                   try {
                       JSONArray subJsonArray = jsonArray.getJSONArray(i) ;
                       for(int j=0; j<subJsonArray.length(); ++j) {
                           if(subJsonArray.get(j) instanceof JSONObject) {
                               try {
                                   JSONObject jsonObject = subJsonArray.getJSONObject(j);
                                   JsonBeanType jsonBeanObject = new JsonBeanType();

                                   jsonBeanObject.setId(jsonObject.optInt("id"));
                                   jsonBeanObject.setName(jsonObject.optString("name"));
                                   jsonBeanObject.setPrice(jsonObject.optDouble("price"));
                                   jsonBeanObject.setPath(jsonObject.getString("path"));

                                   Log.d(TAG, "-->parseJsonArrayByJavaNative: "+jsonBeanObject.toString());
                               } catch (JSONException e) {
                                   Log.d(TAG, "-->parseJsonArrayByJavaNative: Exception: "+e);
                               }
                           }else if(subJsonArray.get(j) instanceof JSONArray) {
                               Log.d(TAG, "-->parseJsonArrayByJavaNative: subJSONArray");
                           } else {
                               Log.d(TAG, "-->parseJsonArrayByJavaNative: i = "+j+" "+subJsonArray.get(j));
                           }
                       }
                   } catch (JSONException e) {
                       e.printStackTrace();
                   }
               } else { //如果数组中的内容是普通标量,可以从JSON数组中直接获取到,不需要解析
                   Log.d(TAG, "parseJsonArrayByJavaNative: i = "+i+" "+jsonArray.get(i));
               }
           }
       } catch (JSONException e) {
           e.printStackTrace();
       }
   }

下面是JSON数组的树状图,以及程序的运行结果,从中可以看出程序已经正确地解析出了JSON数组中的内容。
JSON数组如下:

  [
     "id",
     23,
     {
       "id": 11,
       "name": "jam",
       "price": 3.5,
       "path": "a/b/c"
     },
     [
       "id",
       23,
       {
         "id": 11,
         "name": "jam",
         "price": 3.5,
         "path": "a/b/c"
       }
     ]
   ]

解析结果如下:

 parseJsonArrayByJavaNative: i = 0 id
 parseJsonArrayByJavaNative: i = 1 23
 parseJsonArrayByJavaNative: JsonBeanType{id=11, name='jam', price=3.5, path='a/b/c'}
 -->parseJsonArrayByJavaNative: i = 0 id
 -->parseJsonArrayByJavaNative: i = 1 23
 -->parseJsonArrayByJavaNative: JsonBeanType{id=11, name='jam', price=3.5, path='a/b/c'}

看官们,关于Android中解析JSON数组的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值