JSON解析
关于Json解析(org.json.JSONObject)
小感慨:踏入编成界有几年了,至今连Json解析都不会,平时遇到Json字符串都闲麻烦,直接用String类中的方法进行截取。所谓人无远虑,必有近忧,以前的数据量不是很大,截取还是可以滴,现在数据量变大了,看来再截取已经不是那样了,So...研究了一下Json解析,发觉还是很好用的,果然,Json解析,还是用配套的工具舒服,不多说啦,我研究了集中Json格式的解析方法
1. 普通的Json对象
{"c":0,"m":"120","d":"KJSYRMOVMSOEMB==-FNE"}
如上所示,这就是一个最简单的一个Json对象
JSONObject jsonObj = new JSONObject("{"c":0,"m":"120","d":"KJSYRMOVMSOEMB==-FNE"}");
Log.i("RedWolf","C= "+jsonObj.getInt("c")+" M= "+jsonObj.getString("m")+" D= "+jsonObj.getString("d"));
就这么简单,就把这个Json对象解析出来了,当然,这只是最简单的一种情况
2. Json数组
[{"name":"盖伦","sex":"男","r":"大宝剑"},{"name":"蛮王","sex":"男","r":"野蛮冲撞"}]
如上所示,是一个Json数组,里面有两个Json对象
//把指定的Json转换成字符串数组
JSONArray jsonArray = new JSONArray("[{\"name\":\"盖伦\",\"sex\":\"男\",\"r\":\"大宝剑\"},{\"name\":\"蛮王\",\"sex\":\"男\",\"r\":\"野蛮冲撞\"}]");
//第一个里面装的是盖伦 第二个里面装的是蛮王
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = (JSONObject) jsonArray.opt(i);
DebugUtil.LogI("RedWolf", "姓名:" + jsonObject.getString("name") + " 大招:" + jsonObject.getString("r") + " 性别:" + jsonObject.get("sex"));
}
输出结果
05-23 16:16:38.579 31125-31125/com.red.wolf I/RedWolf: 姓名:盖伦 大招:大宝剑 性别:男
05-23 16:16:38.579 31125-31125/com.red.wolf I/RedWolf: 姓名:蛮王 大招:野蛮冲撞 性别:男
也是很简单的,我们继续...
3. Json对象与Json数组相结合
{"name":"盖伦","sex":"男","skill":[{"name":"审判","info":"无敌风火轮"},{"name":"德玛西亚正义","info":"大宝剑"}],"address":"德玛西亚"}
如上所示,是一个Json对象里面又包含了一个Json数组
原理:先把直接能取出来的取出来,然后再取出数组
try {
String json = "{\"name\":\"盖伦\",\"sex\":\"男\",\"skill\":[{\"name\":\"审判\", \"info\":\"无敌风火轮\"},{\"name\":\"德玛西亚正义\",\"info\":\"大宝剑\"}], \"address\":\"德玛西亚\"}";
// 同样 把字符转变为JsonObject对象
JSONObject jsonObject = new JSONObject(json);
//在这里我们就可以取出我们的姓名,性别和所属势力对不对 各位?
StringBuffer sb = new StringBuffer();
sb.append("姓名:" + jsonObject.getString("name"));
sb.append(" 性别:" + jsonObject.getString("sex"));
sb.append(" 所属势力:" + jsonObject.getString("address"));
//然后我们从这个JsonObject对象中取出我们的JsonArray对象
JSONArray jsonArray = jsonObject.getJSONArray("skill");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObjectSkill = (JSONObject) jsonArray.opt(i);
sb.append(" 技能名:" + jsonObjectSkill.getString("name") + " 技能描述:" + jsonObjectSkill.getString("info"));
}
DebugUtil.LogI("RedWolf", sb.toString());
} catch (JSONException e) {
DebugUtil.LogI("RedWolf","异常"+e);
}
输出结果:
05-23 16:39:32.911 31125-31125/com.red.wolf I/RedWolf: 姓名:盖伦 性别:男 所属势力:德玛西亚 技能名:审判 技能描述:无敌风火轮 技能名:德玛西亚正义 技能描述:大宝剑
4.综合型
[{"name":"盖伦","sex":"男","skill":[{"name":"审判","info":{"mp":"不消耗","type":"AD伤害"}},{"name":"德玛西亚正义","info":{"mp":"不消耗","type":"魔法伤害,对大反派造成真实伤害"}}],"address":"德玛西亚"},{"name":"拉克丝","sex":"女","skill":[{"name":"光之束缚","info":{"mp":"消耗","type":"AP伤害"}},{"name":"透光奇点","info":{"mp":"消耗","type":"AP伤害"}}],"address":"德玛西亚"}]
很多是不?我们按部就班的来就很简单
1. 取出两个英雄
2. 取出英雄名,性别,以及所属势力
3. 取出两个技能
4. 取出技能名,技能描述
5. 取出技能描述
6. 取出是否耗蓝和伤害类型
接下来上代码:
String json = "[{\"name\":\"盖伦\",\"sex\":\"男\",\"skill\":[{\"name\":\"审判\",\"info\":{\"mp\":\"不消耗\",\"type\":\"AD伤害\"}},{\"name\": \"德玛西亚正义\",\"info\":{\"mp\":\"不消耗\",\"type\":\"魔法伤害,对大反派造成真实伤害\"}}],\"address\":\"德玛西亚\"},{\"name\":\"拉克丝 \",\"sex\":\"女\",\"skill\":[{\"name\":\"光之束缚\",\"info\":{\"mp\":\"消耗\",\"type\":\"AP伤害\"}},{\"name\":\"透光奇点\",\"info\": {\"mp\":\"消耗\",\"type\":\"AP伤害\"}}],\"address\":\"德玛西亚\"}]";
//由于他的最外部是一个数组,所以 首先 我们需要得到两个JsonArray
//(0)盖伦 {"name":"盖伦","sex":"男","skill":[{"name":"审判","info":{"mp":"不消耗","type":"AD伤害"}},{"name":"德玛西亚正义","info":{"mp":"不消 耗","type":"魔法伤害,对大反派造成真实伤害"}}],"address":"德玛西亚"}
//(1)拉克丝 {"name":"拉克丝","sex":"女","skill":[{"name":"光之束缚","info":{"mp":"消耗","type":"AP伤害"}},{"name":"透光奇点","info":{"mp":"消 耗","type":"AP伤害"}}],"address":"德玛西亚"}
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
//依次取出
JSONObject jsonObject = (JSONObject) jsonArray.opt(i);
StringBuffer sb = new StringBuffer();
sb.append("姓名:" + jsonObject.getString("name"));
sb.append(" 性别:" + jsonObject.getString("sex"));
sb.append(" 所属势力:" + jsonObject.getString("address"));
//我们还剩下技能没有选择是不是,技能也是一个JSONArray
JSONArray jsonArray1 = jsonObject.getJSONArray("skill");
//我们就得到了(盖伦为例)
//{"name":"审判","info":{"mp":"不消耗","type":"AD伤害"}}
//{"name":"德玛西亚正义","info":{"mp":"不消耗","type":"魔法伤害,对大反派造成真实伤害"}}
for (int i1 = 0; i1 < jsonArray1.length(); i1++) {
JSONObject jsonObject1 = (JSONObject) jsonArray1.opt(i1);
sb.append(" 技能名:" + jsonObject1.getString("name"));
//然后我们发现 技能描述也是一个JsonObject对象,现在我们就已经轻车熟路了吧
JSONObject jsonObject2 = jsonObject1.getJSONObject("info");
//我们就得到了(盖伦为例)
//{"mp":"不消耗","type":"AD伤害"}
sb.append(" 是否耗蓝:" + jsonObject2.getString("mp"));
sb.append(" 伤害类型:" + jsonObject2.getString("type"));
}
DebugUtil.LogI("RedWolf", sb.toString());
sb = new StringBuffer();
}
当然,最后的打印结果也是想象之中的
05-23 17:26:58.477 14655-14655/com.red.wolf I/RedWolf: 姓名:盖伦 性别:男 所属势力:德玛西亚 技能名:审判 是否耗蓝:不消耗 伤害类型:AD伤害 技能名:德玛西亚正义 是否耗蓝:不消耗 伤害类型:魔法伤害,对大反派造成真实伤害
05-23 17:26:58.477 14655-14655/com.red.wolf I/RedWolf: 姓名:拉克丝 性别:女 所属势力:德玛西亚 技能名:光之束缚 是否耗蓝:消耗 伤害类型:AP伤害 技能名:透光奇点 是否耗蓝:消耗 伤害类型:AP伤害
OK,走完这四步,Json解析基本就搞懂了.