Android 较复杂JSON的解析过程

首先先上一张图,一起来看下什么叫做较复杂的Json字符串:


看到这图你应该知道它确实是比一般的JSON复杂了吧,因为它一层套一层,并且出现了JSONArray里面的子JSONObject又嵌套了JSONArray的情况,那么接下来别虚,跟随我的脚步一起来征服它。

首先可以看到data里面是我们所关心的数据,第一个JSON对象是class 他的值是一个JSON数组,而数组里面是对象是简单的String类型的键值关系,那么好办,直接使用谷歌提供的JSON映射到对象的工具gson即可解决,这里我封装好了一个JSON映射泛型对象、返回对象LIST的方法,可以针对不同的对象来解析使用,而不用为每一个对象写一个方法,相当的方便,下面是这个方法的代码:

public static <T> List<T> fromJsonArray(String json, Class<T> clazz)
			throws Exception {
		List<T> lst = new ArrayList<T>();
		JsonArray array = new JsonParser().parse(json).getAsJsonArray();
		for (final JsonElement elem : array) {
			lst.add(new Gson().fromJson(elem, clazz));
		}
		return lst;
List<net.micode.bean.Class> listTem = JsonTools.fromJsonArray(
		response.getJSONObject("data").getString("classes"),net.micode.bean.Class.class);

其中response为JSON的字符串形式,OK通过这个方法,即把class搞定了

我们都知道有许多工具类框架可以很方便帮我们解析JSON,比如GSON,FASTJSON,XUITL等,这些高度集成的工具可以一行代码就帮我们把JSON解析成对象集合,但是其原理及解析过程我们往往是不明白的,并不利于我们的学习和提高。

那么接下来我们就用原生的方法,不使用框架,只用原生objeci和array的方法来解析,以便于理解整个解析过程

首先把与class同级的对象解析出来:

response.getJSONObject("data").getString("activityTitle")

response.getJSONObject("data").getString("mob_large_img")

其他类似。

OK那么接下来就解析rules对象——造成此段JSON较复杂的罪魁祸首。

可以看到rules对象里面的值是一个JSONArray,那么首先先把这个JSONArray转化为一个个JSONObject,那么接下来就可以获取到JSONObject里面的键所对应的String值,而其中有一个健child_list所对应的值为JSONArray,而这个JSONArray只有一个JSONObject,那么我们获取到这个child_list所对应的值为JSONArray,再获取JSONArray中的JSONObject,就可以最终把这最后的这个JSONObject里面的值所解析出来,如此,便把这个JSON字符串所有的数据解析出来了。

代码如下:

try {

<span style="white-space:pre">	</span>JSONArray arr = response.getJSONObject("data").getJSONArray("rules");
	for (int i = 0; i < arr.length(); i++) {
	<span style="white-space:pre">	</span>JSONObject temp = (JSONObject) arr.get(i);
		// System.out.println(temp.get("content")+":");
<span style="white-space:pre">		</span>View contentView = LayoutInflater.from(ActDetails.this).inflate(R.layout.act_details_content_item,null, false);
		TextView contentTitle = (TextView) contentView.findViewById(R.id.contentTitle);
		contentTitle.setText(temp.get("content") + ":");
		TextView content = (TextView) contentView.findViewById(R.id.content);
		content.setText(((JSONObject) temp.getJSONArray("child_list").get(0)).getString("content"));
		contentLayout.addView(contentView);
		System.out.println(((JSONObject) temp.getJSONArray("child_list").get(0))
						.get("content").toString());
				}
			} catch (JSONException e) {
			e.printStackTrace();
		} catch (Exception e) {
		e.printStackTrace();
	}
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值