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。

  • 相关阅读:
    Security » Authorization » 要求处理器中的依赖注入
    Security » Authorization » 基于自定义策略的授权
    Security » Authorization » 基于声明的授权
    Security » Authorization » 基于角色的授权
    CentOS下下载软件,不安装的方法
    rsync+sersync+inotify实现服务器间文件同步之一
    linux查看机器负载
    htpasswd建立和更新存储用户名、密码
    由异常掉电问题---谈xfs文件系统
    Flashcache基本使用及注意事项
  • 原文地址:https://www.cnblogs.com/twodog/p/12137879.html
Copyright © 2011-2022 走看看