一起Talk Android吧(第三百四十八回:解析JSON数组三)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第三百四十八回:解析JSON数组三)相关的知识,希望对你有一定的参考价值。
各位看官们,大家好,上一回中咱们说的是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数组的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于一起Talk Android吧(第三百四十八回:解析JSON数组三)的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第三百四十九回:解析JSON数组四)
一起Talk Android吧(第三百四十七回:解析JSON数组二)
一起Talk Android吧(第三百四十六回:解析JSON数组一)
一起Talk Android吧(第三百八十八回:lifecycle)