• 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解析基本就搞懂了.

  • 相关阅读:
    Android开发进阶——自定义View的使用及其原理探索
    Android开发——通过wifi接收IPCamera视频流
    (数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
    (数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下)
    (数据科学学习手札82)基于geopandas的空间数据分析——geoplot篇(上)
    (数据科学学习手札81)conda+jupyter玩转数据科学环境搭建
    (数据科学学习手札80)用Python编写小工具下载OSM路网数据
    (数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色
    实用的Python(3)超简单!基于Python搭建个人“云盘”
    (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
  • 原文地址:https://www.cnblogs.com/redwolf/p/5520836.html
Copyright © 2020-2023  润新知