zoukankan      html  css  js  c++  java
  • JSON解析的成长史——原来还可以这么简单

    本文系统介绍,JSON解析的成长史,未经允许,禁止转载。
    JSON是一种轻量级的数据格式,一般用于数据交互

    Android交互数据主要有两种方式:Json和Xml,Xml格式的数据量要比Json格式略大,为了节省流量,减轻服务器压力,目前绝大多数公司都使用Json交互。

    目录

    [一、使用原生方式解析Json](## 一、使用原生方式解析Json)
    [二 、Gson框架的使用](##二 、Gson框架的使用)
    [三 、插件GsonFormat快速实现JavaBean](##三 、插件GsonFormat快速实现JavaBean)

    一、使用原生方式解析Json

    Json主要通过”{ }” 和 “[ ]” 包裹数据,”{ }”里面存放key-value键值对, “[ ]” 里存放数组。
    标准的Json格式key必须用双引号。 下面都是Json:

     {"name" : "jack", "age" : 10}
    
    {"names" : ["jack", "rose", "jim"]}
    
    [{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

    要想从JSON中挖掘出具体数据,得对JSON进行解析。分别来看看三个不同的Json是如何解析的:

    public void parseJson1(){
            String json1="{"name" : "jack", "age" : 10}";
            try {
                //把要解析的json通过构造方法告诉JSONObject
                JSONObject jsonObject=new JSONObject(json1);
                // 获取name
                String name=jsonObject.getString("name");
                int age=jsonObject.getInt("age");
                Log.i("ParserJsonActivity","name:"+name);
                Log.i("ParserJsonActivity","age:"+age);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
        public void parseJson2(){
            String json2="{"names" : ["jack", "rose", "jim"]}";
            try {
                //把要解析的json通过构造方法告诉JSONObject
                JSONObject jsonObject=new JSONObject(json2);
                //names对应的 JsonArray
                JSONArray jsonArray=jsonObject.getJSONArray("names");
                //遍历JSONArray
                for(int i=0;i<jsonArray.length();i++){
                    Log.i("ParserJsonActivity","name"+i+":"+jsonArray.getString(i));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
        public void parseJson3(){
            String json3="[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]";
            try {
                //把要解析的json通过构造方法告诉JSONArray
                JSONArray jsonArray=new JSONArray(json3);
                //遍历JSONArray
                for(int i=0;i<jsonArray.length();i++){
                    //根据i的位置获取JSONObject
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    String name = jsonObject.getString("name");
                    int age=jsonObject.getInt("age");
                    Log.i("ParserJsonActivity","name"+i+":"+name);
                    Log.i("ParserJsonActivity","age"+i+":"+age);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    上面的代码,主要使用了JSONObject和JSONArray。
    用Android原生的Api有一句真理,别问我怎么知道的,很难:

    当碰到 “{ }”时用JSONObject解析,遇到“[ ]”时用JSONArray解析。

    分别运行下三个方法,看看结果:
    这里写图片描述

    想要的数据全部都获取到了。

    二 、Gson框架的使用

    如果你认为使用JSONObject和JSONArray来解析JSON数据已经非常简单了,那你就容易太满足了。早就有框架可以使用了。

    常见的框架有 Gson,Jackson等等,他们都各有优缺点,但是总体区别不大。

    GSON方式
    * 原理:基于事件驱动
    * 优点:解析方法简单、解析效率高、占存少、灵活性高
    * 使用情境:适用于需要处理大型 JSON文档、JSON文档结构复杂的场合

    Jackson方式
    * 原理:基于事件驱动
    * 优点:解析效率最高、在数据量大的情况优势尤为明显、占存少
    * 缺点:必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;
    * 使用情境: 适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、性能要求较高的场合

    我一直用GSON方式解析,使用起来比较简单。
    首先在app/build.gradle中添加依赖。

    dependencies {
        ...
        compile 'com.google.code.gson:gson:2.6.2'
    }

    Gson是基于事件驱动,根据所需要取的数据通过建立一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。

    步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)
    GSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:
    * JSON的大括号对应一个对象,对象里面有key和value(值)。在JavaBean里面的类属性要和key同名;
    * JSON的方括号对应一个数组,所以在JavaBeanBean里面对应的也是数组或者集合,数据里面可以有值或者对象;
    * 如果数组里面只有值没有key,就说明它只是一个纯数组,如果里面有值有key,则说明是对象数组。纯数组对应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是对应的对象里面的key,建立了之后要创建一个这个内部类的对象,名字对应数组名;
    * 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key。

    注意:JavaBean类里的属性不一定要全部和JSON数据里的所有key相同,可以按需取数据,也就是你想要哪种数据,就把对应的key属性写出来,注意名字一定要对应。

    接下来,我们来看下下面两条JSON数据按照上面的规则应该何如生成JavaBean对象。

    {"name" : "jack", "age" : 10}
    
    {"names" : ["jack", "rose", "jim"]}

    第一个:

    /**
     * {"name" : "jack", "age" : 10}
     */
    public class Person1 {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

    第二个:

    /**
     * {"names" : ["jack", "rose", "jim"]}
     */
    public class Person2 {
    
        private List<String> names;
    
        public List<String> getNames() {
            return names;
        }
    
        public void setNames(List<String> names) {
            this.names = names;
        }
    }

    再来看看使用如何Gson解析:
    主要方法为:fromJson()

    public  void  useGsonParser1(){
        String json1="{"name" : "jack", "age" : 10}";
        Gson gson=new Gson();
        //把json数据解析成Person1对象
        Person1 person1 = gson.fromJson(json1, Person1.class);
        Log.i("UseGsonActivity","name:"+person1.getName());
        Log.i("UseGsonActivity","age:"+person1.getAge());
    }
    public  void  useGsonParser2(){
        String json2="{"names" : ["jack", "rose", "jim"]}";
        Gson gson=new Gson();
        Person2 person2=gson.fromJson(json2,Person2.class);
        List<String> names = person2.getNames();
        for(int i=0;i<names.size();i++){
            Log.i("UseGsonActivity","name"+i+":"+names.get(i));
        }
    }

    细心的同学会发现,之前使用JSONObject和JSONArray解析了3条数据,而我们并没有使用GSON解析最后一条。

    [{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

    最后一条比较特殊,是以”[ ]”开头,我们知道因为大括号{ } 代表的是对象,中括号[]代表的是集合或者数组,所以javaBean直接使用Person1就行了,只不过返回的是一个集合或者数组。我们需要借助TypeToken,具体代码如下:

    public  void useGsonParser3(){
        String json3="[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]";
        Gson gson=new Gson();
        List<Person1> person2=gson.fromJson(json3,new TypeToken<ArrayList<Person1>>(){}.getType());
        for(int i=0;i<person2.size();i++){
            //根据i的位置获取JSONObject
            Person1 person1 = person2.get(i);
            String name = person1.getName();
            int age=person1.getAge();
            Log.i("UseGsonActivity","name"+i+":"+name);
            Log.i("UseGsonActivity","age"+i+":"+age);
        }
    }

    调用上面的三段代码来看看运行结果:

    这里写图片描述
    想要的数据依然全部都获取到了。
    上面的Gson介绍,基本上可以满足绝大多数的开发需求。

    三 、插件GsonFormat快速实现JavaBean

    上面我们介绍了,使用Gson开源库解析JSON数据,大家可能会发现虽然解析代码比较简单,但是还需要自己按照规则写一个javaBean。

    好消息来了,通过AndroidStudio插件,你甚至不需要再手动写JavaBean了,让你Biubiubiu的立刻完成~

    首先需要安装GsonFormat ,安装方式:
    1. Android Studio File->Settings..->Plugins–>Browse repositores..搜索GsonFormat
    2. 安装插件,重启Android Studio。

    这里写图片描述
    重启完了,接下来就是见证奇迹的时刻了。
    我们以下面的JSON为例,让大家看看如何快速生成JavaBean:

    {
      "showapi_res_code": 0,
      "showapi_res_error": "",
      "showapi_res_body": {
        "areaCode": "0871",
        "city": "昆明",
        "name": "中国电信",
        "num": 1890871,
        "postCode": "650000",
        "prov": "云南",
        "provCode": "530000",
        "ret_code": 0,
        "type": 2
      }
    }

    使用方式,在实体类中使用Generate的快捷键。默认快捷键 alt+Insert。

    这里写图片描述
    选择GsonFormat
    这里写图片描述

    把JSON数据粘贴进去。然后联系点击OK,就会自动生成想要的JavaBean。

    这里写图片描述
    动态效果图:
    这里写图片描述
    使用GsonFormat可以极大的提高开发的效率,有木有一种如沐春风的感觉啊。

    更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

    这里写图片描述

  • 相关阅读:
    chrome浏览器中安装以及使用Elasticsearch head 插件
    windows10 升级并安装配置 jmeter5.3
    linux下部署Elasticsearch6.8.1版本的集群
    【Rollo的Python之路】Python 爬虫系统学习 (八) logging模块的使用
    【Rollo的Python之路】Python 爬虫系统学习 (七) Scrapy初识
    【Rollo的Python之路】Python 爬虫系统学习 (六) Selenium 模拟登录
    【Rollo的Python之路】Python 爬虫系统学习 (五) Selenium
    【Rollo的Python之路】Python 爬虫系统学习 (四) XPath学习
    【Rollo的Python之路】Python 爬虫系统学习 (三)
    【Rollo的Python之路】Python sys argv[] 函数用法笔记
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329903.html
Copyright © 2011-2022 走看看