Json解析总结

前言:在Android开发中我们避免不了从服务端获取数据,而服务端返回的数据基本上都是Json格式的,今天乘着公司不忙,特地总结一下Json的几种解析方式。

一、Json是什么?

JSON是一种取代XML的数据结构,和xml相比,它更小巧但是性能仍然很好,由于它的小巧所以网络传输数据使用的流量更少,传输的速度更快。JSON就是一串字符串 只不过元素会使用特定的符号标注。
Json语法:

  • {} 双括号表示对象
  • [] 中括号表示数组
  • "" 双引号内是属性或值
  • : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

所以 {"name": "张三"} 可以理解为是一个包含name为张三的对象
而[{"name": "张三"},{"name": "李四"}]就表示包含两个对象的数组
当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面的步骤,这是一个拥有一个name数组的对象

二、Json怎么用?

生成json数据(这里只是简单生成了一个Json对象,这里我们重点放在Json解析上)

 JSONObject jsonObject = new JSONObject();
 jsonObject.put("name", "张三");
 jsonObject.put("age",18);

三、Json解析

这里三种方式难度依次递进,掌握了前两种几乎就掌握了第三种,练习好了第三种以后碰到即使很复杂的数据也是这种套路,亲测没毛病!

①Json对象解析

   /*   {
             "name":"大白",
             "age":2
             }*/
    String str1 = "{\n" +
            "              \"name\":\"大白\",\n" +
            "             \"age\":2\n" +
            "             }";

JSONObject jsonObject = new JSONObject(str1.toString());
        String name = jsonObject.getString("name");
        int age = jsonObject.getInt("age");
        Str1 str1 = new Str1();
        str1.setName(name);
        str1.setAge(age);

②json数组解析

  /*
    [
    {"name":"张三","age":18},
    {"name":"李四","age":19},
    {"name":"王五","age":20}
    ]
     */
    String str2 = "  [\n" +
            "    {\"name\":\"张三\",\"age\":18}, \n" +
            "    {\"name\":\"李四\",\"age\":19}, \n" +
            "    {\"name\":\"王五\",\"age\":20}    \n" +
            "    ]  ";

        JSONArray jsonArray = new JSONArray(str2.toString());
        ArrayList<Str2> list2 = new ArrayList<>();
        JSONObject jsonObject = null;
        Str2  str2 = null;
        for (int i=0;i<jsonArray.length();i++) {
            jsonObject = jsonArray.getJSONObject(i);
            str2 = new Str2();
            str2.setName(jsonObject.getString("name"));
            str2.setAge(jsonObject.getInt("age"));
            list2.add(str2);
            str2 = null;
        }

③json对象和数组解析

 /*
    {
    "banji": "初中一班",
    "message": "1",
    "student": [{
        "name": "张三",
        "age": 18
    }, {
        "name": "李四",
        "age": 19
    }, {
        "name": "王五",
        "age": 20
    }]
}
     */
    String str3 = "{\n" +
            "\t\"banji\": \"初中一班\",\n" +
            "\t\"message\": \"1\",\n" +
            "\t\"student\": [{\n" +
            "\t\t\"name\": \"张三\",\n" +
            "\t\t\"age\": 18\n" +
            "\t}, {\n" +
            "\t\t\"name\": \"李四\",\n" +
            "\t\t\"age\": 19\n" +
            "\t}, {\n" +
            "\t\t\"name\": \"王五\",\n" +
            "\t\t\"age\": 20\n" +
            "\t}]\n" +
            "}";

        JSONObject jsonObject  = new JSONObject(str3.toString());
        ArrayList<Str3.Student> list3 = new ArrayList<>();
        Str3 str3 = new Str3();
        String banji = jsonObject.getString("banji");
        String message = jsonObject.getString("message");
        //对student集合进行解析
        JSONArray students = jsonObject.getJSONArray("student");
        for (int i=0;i<students.length();i++) {
            JSONObject jsonObject1 = students.getJSONObject(i);
            String name = (String) jsonObject1.get("name");
            int age = (int) jsonObject1.get("age");
            Str3.Student student  = new Str3.Student();
            student.setName(name);
            student.setAge(age);
            list3.add(student);
            student  = null;
        }

        str3.setBanji(banji);
        str3.setMessage(message);
        str3.setStudents(list3);

总结:从服务端返回的数据一般都是第三种格式的,现在想一下如果student中的属性除了name和age之外还有weigth、aihao(体重、爱好)等等很多属性,那么代码量又要增加了,再想一下如果返回的数据包含很多像student这样的数组那我们Json解析的部分就真的要写好多好多这样无聊的代码了,这里相应实体类没有贴出来。实际项目开发中,数据解析是很多的,这些操作如果我们自己写就很烦人,所以实际开发中一般都是用Gson+GsonFormat(Gson库解析Json数据+GsonFormat帮助我们快速新建实体类)
晋级篇:Gson+GsonFormat快速解析Json
最后:推荐一个网站在线Json校验可以帮助校验Json格式的数据,非常好使
项目源码:http://t.cn/R8uyrbo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,138评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 如果你理解90%的利润在后端的话,那应该知道我们成交的目的不是为了单次的销售,而是要通过后面不断的“追销”策略来获...
    元兵阅读 202评论 0 0
  • 1.写一两段话(如回忆一个场景),其中包含有触觉和身体感觉。 栀子的香是情人的手。 初次见你,你像一条鱼一样游进我...
    和和打怪阅读 274评论 3 0
  • 新年在即,看着乱糟糟的飘窗台,感觉很是不爽,甚至都不愿意再多盯上它一眼。我想很多人都有着这样一种体会:"哎,看着乱...
    d9e3ede3fe6c阅读 488评论 0 1