首先先上一张图,一起来看下什么叫做较复杂的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();
}
}