一起talkandroid吧(第三百四十八回:解析json数组三)(代码片段)

talk_8 talk_8     2022-12-06     748

关键词:

各位看官们,大家好,上一回中咱们说的是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: JsonBeanTypeid=11, name='jam', price=3.5, path='a/b/c'
 -->parseJsonArrayByJavaNative: i = 0 id
 -->parseJsonArrayByJavaNative: i = 1 23
 -->parseJsonArrayByJavaNative: JsonBeanTypeid=11, name='jam', price=3.5, path='a/b/c'

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

一起talkandroid吧(第三百四十五回:解析json对象)(代码片段)

...子是解析JSON对象。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,我们在前面章回中介绍了JSON对象的格式,在本章回中我们将介绍如何去解析JSON对象,也就是把JSON对象转换成Java对象& 查看详情

一起talkandroid吧(第三百四十六回:解析json数组一)(代码片段)

...子是解析JSON数组。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,我们在前面章回中介绍了JSON数组的格式,在本章回中我们将介绍如何去解析JSONv数组,也就是把JSON数组转换成Ja 查看详情

一起talkandroid吧(第三百四十七回:解析json数组二)(代码片段)

...继续介绍此例子。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,我们在本章回中继续介绍如何解析JSON数组,不过本章回中JSON数组与上一章回中的不同,主要区别在于添加了标量类型的数组成员。我... 查看详情

一起talkandroid吧(第三百八十八回:lifecycle)(代码片段)

...子是lifecycle。闲话休提,言归正转,让我们一起TalkAndroid吧!概念介绍看官们,L 查看详情

一起talkandroid吧(第三百八十八回:lifecycle)(代码片段)

...子是lifecycle。闲话休提,言归正转,让我们一起TalkAndroid吧!概念介绍看官们,L 查看详情

一起talkandroid吧(第三百七十八回:给viewpager添加indicator)(代码片段)

...给ViewPager添加indicator。闲话休提,言归正转,让我们一起TalkAndroid吧!看官们,我们在前面章回中介绍了ViewPager2的用法,本章回中将介绍如何给ViewPager添加指示器(indicatior), 查看详情

一起talkandroid吧(第三百四十四回:json概述)(代码片段)

...介绍的例子是JSON。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,JSON是一种数据转换格式,它主要用于转换网络中不同的数据,它不是Android中的内容,只是我们在Android中 查看详情

一起talkandroid吧(第三百四十回:android中的retrofit)(代码片段)

...的例子是Retrofit。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,我们先介绍一下Retrofit,它主要用来封装HTTP相关的功能,它的主要功能和OkHttp一样。在实际中可以把它当作Ok 查看详情

一起talkandroid吧(第三百三十八回:android中的okhttp一)(代码片段)

...是Android中的OkHttp。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,我们在本章回中介绍另外一种HTTP库:OkHttp。它由三方公司提供,不过由于它出色的优势也得到了Androi 查看详情

一起talkandroid吧(第三百一十八回:java中的类型转换)(代码片段)

...Java中的类型转换。闲话休提,言归正转。让我们一起TalkAndroid吧!我们在本章回中介绍Java类型转换的知识,主要是把十六进制形式的字符串转换成十六进制形式的字节数组,大家听着可能不明白,我举个例子... 查看详情

一起talkandroid吧(第三百九十八回:从网络中获取bitmap二)(代码片段)

...介绍该例子。闲话休提,言归正转,让我们一起TalkAndroid吧!使用方法我们在上一章回中介绍了从网络的输入流中直接获取Bitmap,本章回再介绍另外一种方法:把 查看详情

一起talkandroid吧(第三百二十八回:android中网络通信之upd概述)(代码片段)

...络通信之UDP概述。闲话休提,言归正转。让我们一起TalkAndroid吧!什么是UDP看官们,UDP(UserDatagramProtocol)是协议名称的缩写,它是一种无连接的协议,通俗点说就是通信双方可以直接通信&# 查看详情

一起talkandroid吧(第三百五十八回:gson库解析java对象)(代码片段)

...son库解析Java对象。闲话休提,言归正转。让我们一起TalkAndroid吧!操作步骤看官们,我们在本章回中将介绍如何使用Gson库解析Java对象,这里所说的解析就是把Java对象转换成JSON字符串。下面是具体的操作步骤࿱... 查看详情

一起talkandroid吧(第三百四十一回:android中如何使用浏览器)(代码片段)

...何使用浏览器”。闲话休提,言归正转。让我们一起TalkAndroid吧!浏览器的作用看官们,我们在前面章回中介绍了如何使用HTTP相关接口从服务器上请求数据,收到服务器返回的数据后我们就可以使用了,不过... 查看详情

一起talkandroid吧(第三百零八回:程序的主题)(代码片段)

...子是程序的主题。闲话休提,言归正转。让我们一起TalkAndroid吧!看官们,程序的主题也叫theme,它类似于上一章回中介绍的style,它也是属性的集合,不过这里的属性是Android系统自己定义 查看详情

一起talkandroid吧(第三百零九回:风格vs主题)

一起TalkAndroid吧(第三百零九回:风格VS主题)一起TalkAndroid吧(第三百零九回:风格VS主题)一起TalkAndroid吧(第三百零九回:风格VS主题)一起TalkAndroid吧(第三百零九回:风格VS主题)一起TalkAndroid吧(第三百零九回:风格VS主... 查看详情

一起talkandroid吧(第四百一十八回:制作时钟)(代码片段)

...制作时钟"。闲话休提,言归正转,让我们一起TalkAndroid吧!看官们,我们在前面章回中介绍了绘图相关的内容,本章回中 查看详情

一起talkandroid吧(第三百五十一回:解析json数据总结)

...解析JSON数据总结。闲话休提,言归正转。让我们一起TalkAndroid吧!内容总结看官们,我们在前面章回中介绍了多种解析JSON数据的方法,在这里我们做统一的总结:JSON数据分为标量、对象和数组 查看详情