JSON解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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解析基本就搞懂了.

以上是关于JSON解析的主要内容,如果未能解决你的问题,请参考以下文章

使用 json rereiver php mysql 在片段中填充列表视图

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

NodeJs GraphQL 片段解析器

不要在片段中显示列表视图项

Json解析工具类

Golang实践录:反射reflect的一些研究及代码汇总