zoukankan      html  css  js  c++  java
  • JSON介绍及Android最全面解析方法(Gson、AS自带org.son、Jackson解析)

    这里写图片描写叙述

    前言

    今天,我们来介绍一下现今主流的数据交换格式-JSON!

    相同作为主流为数据交换格式-XML,假设有兴趣能够阅读我写的XML及其DOM、SAX、PULL解析方法和对照

    文件夹

    JSON简单介绍&解析方法介绍]

    定义

    JavaScript Object Notation,JavaScript的对象表示法,是一种轻量级的文本数据交换格式。

    作用

    用于数据的标记、存储和传输。

    特点

    • 轻量级的文本数据交换格式
    • 独立于语言和平台
    • 具有自我描写叙述性
    • 读写速度快,解析简单

    语法

    JSON值
    - 名称/值
    - 数组
    - 对象

    JSON实例

    "skill":{
              "web":[
                     {
                      "name":"html",
                      "year":"5"
                     },
                     {
                      "name":"ht",
                      "year":"4"
                     }],
               "database":[
                      {
                      "name":"h",
                      "year":"2"
                     }]
    `}}
    • “名称/值”对
      无序、一个对象用“{}”包含。名称和值间用“:”相隔,对象间用“,”隔开;
      “`
      “name”:”html”
    - 对象
    一个JSON对象包含多个名称/值对,在花括号中书写

    { “name”:”html”,”year”:”5”}

    
    - 数组
    数组以“[]”包含,数据的对象用逗号隔开
    ``` "web":[
                     {
                      "name":"html",
                      "year":"5"
                     },
                     {
                      "name":"ht",
                      "year":"4"
                     }]
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    web和database都是一个数组

    语法总结

    数组 [ 对象 { 值/对”” } ]

    数组包含对象,对象包含值/对

    JSON解析

    在了解了JSON后。是时候来看下怎样在Android解析JSON数据

    解析方法

    Android解析JSON数据的方法和XML解析相似,主要有两种:
    基于事件驱动基于文档驱动解析方式

    基于事件驱动

    • 主流方式:Gson解析和Jackson解析

    Gson介绍
    - 简单介绍:使用谷歌的开源库进行解析
    - 解析方式:基于事件驱动,依据所须要取的数据通过建立一个相应于JSON数据的JavaBean类就能够通过简单的操作解析出所需JSON数据

    Gson解析

    步骤1:创建一个与JSON数据相应的JavaBean类(用作存储须要解析的数据)
    GSON解析的关键是重点是要依据json数据里面的结构写出一个相应的javaBean,规则是:
    1. JSON的大括号相应一个对象。对象里面有key和value(值)。

    在JavaBean里面的类属性要和key同名。
    2. JSON的方括号相应一个数组,所以在JavaBeanBean里面相应的也是数组,数据里面能够有值或者对象。
    3. 假设数组里面仅仅有值没有key,就说明它仅仅是一个纯数组,假设里面有值有key。则说明是对象数组。纯数组相应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是相应的对象里面的key,建立了之后要创建一个这个内部类的对象。名字相应数组名。
    4. 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key

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

    下面有两个JSON文档来说明创建JavaBean类的创建方法

    简单的JSON数据1(对象)

    String json = "{"id":1,"name":"小明","sex":"","age":18,"height":175}";
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    步骤1:创建简单的JSON数据相应的JavaBean类

    package scut.learngson;
    
    public class EntityStudent {
        private int id;
        private String name;
        private String sex;
        private int age;
        private int height;
    
        public void setId(int id){
            this.id = id;
        }
        public void setName(String name){
            this.name = name;
        }
        public void setSex(String sex){
            this.sex = sex;
        }
        public void setAge(int age){
            this.age = age;
        }
        public void setHeight(int height){
            this.height = height;
        }
        public int getId(){
            return id;
        }
        public String getName(){
            return name;
        }
        public String getSex(){
            return sex;
        }
        public int getAge(){
            return age;
        }
        public int getHeight(){
            return  height;
        }
        public void show(){
                    System.out.print("id=" + id + ",");
                    System.out.print("name=" + name+",");
                    System.out.print("sex=" + sex+",");
                    System.out.print("age=" + age+",");
                    System.out.println("height=" + height + ",");
    
        }
    }
    
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    复杂的JSON数据(具备嵌套)

    {"translation":["车"],
      "basic":
        {
          "phonetic":"kɑː",
          "explains":["n. 汽车。车厢","n. (Car)人名;(土)贾尔。(法、西)卡尔;(塞)察尔"]},
      "query":"car",
      "errorCode":0,
      "web":[{"value":["汽车","车子","小汽车"],"key":"Car"},
             {"value":["概念车","概念车","概念汽车"],"key":"concept car"},
             {"value":["碰碰车","碰撞用汽车","碰碰汽车"],"key":"bumper car"}]
    }
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    步骤1:复杂的JSON数据相应的JavaBean类

    package scut.httpgson;
    import java.util.List;
    
    public class student {
        public String[] translation;    //["车"]数组
        public basic basic;             //basic对象里面嵌套着对象。创建一个basic内部类对象
        public  static class basic{     //建立内部类
            public String phonetic;
            public String[] explains;
        }
        public String query;
        public int errorCode;
        public List<wb> web;            //web是一个对象数组,创建一个web内部类对象
        public static class wb{         
                public String[] value;
                public String key;
            }
    
        public void show(){
            //输出数组
            for (int i = 0;i<translation.length;i++)
            {
            System.out.println(translation[i]);
            }
            //输出内部类对象
            System.out.println(basic.phonetic);
            //输出内部类数组
            for (int i = 0;i<basic.explains.length;i++){
                System.out.println(basic.explains[i]);
            }
            System.out.println(query);
            System.out.println(errorCode);
            for (int i = 0;i<web.size();i++){
                for(int j = 0; j<web.get(i).value.length;j++)
                {
                    System.out.println(web.get(i).value[j]);
                }
                System.out.println(web.get(i).key);
            }
        }
        }
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    好了。是不是认为依据JSON文本数据去转换成JavaBean实体类非常复杂呢?事实上还有个简单的方法,请使用在线JSON字符串转Java实体类。哈哈请不要打我,继续往下看吧。

    步骤2:下载并导入GSON须要的库

    别翻墙去谷歌官网下了,点这吧

    步骤3:用Gson进行转换

    package scut.learngson;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import com.google.gson.Gson;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Gson gson = new Gson();
            //创建JavaBean类的对象
          Student student = new EntityStudent();
            String json = "{"id":1,"name":"小明","sex":"男","age":18,"height":175}";
           //用GSON方法将JSON数据转为单个类实体
            student = gson.fromJson(json,Student.class);
           //调用student方法展示解析的数据
            student.show();
          //将Java集合转换为json
            String json2 = gson.toJson(List);        System.out.println(json2);
        }
    }
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    总结

    能够看到,利用GSON方法进行解析,关键在于依据json数据里面的结构写出一个相应的javaBean,而解析过程非常easy:

    JavaBean对象 = gson.fromJson(son,javaBean类类名.class);
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    Jackson解析
    - 解析原理:基于事件驱动,与GSON相同,先创建一个相应于JSON数据的JavaBean类就能够通过简单的操作解析出所需JSON数据。

    但和Gson解析不同的是。GSON可按需解析。即创建的JavaBean类不一定全然涵盖所要解析的JSON数据,按需创建属性。但Jackson解析相应的JavaBean必须把Json数据里面的全部key都有所相应,即必须把JSON内的数据全部解析出来,无法按需解析。

    但Jackson的解析速度和效率都要比GSON高

    • 核心代码

    JSON数据

    {"student":
              [
               {"id":1,"name":"小明","sex":"男","age":18,"height":175,"date":[2013,8,11]},
               {"id":2,"name":"小红","sex":"女","age":19,"height":165,"date":[2013,8,23]},
               {"id":3,"name":"小强","sex":"男","age":20,"height":185,"date":[2013,9,1]}
              ],
      "grade":"2"
    }
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    步骤1:建立相应的javaBean:

    建立javaBean的相应规则和GSON一样

    package scut.learnjackson;
    
    import java.util.ArrayList;
    import java.util.List;
    class test {
        private  List<stu> student = new ArrayList<stu>();
    
        private  int grade;
    
        public void setStudent(List<stu> student){
            this.student = student;
        }
        public List<stu> getStudent(){
            return student;
        }
        public void setGrade(int grade){
            this.grade = grade;
        }
        public int getGrade(){
            return grade;
        }
        private static class stu {
            private  int id;
            private  String name;
            private  String sex;
            private  int age;
            private  int height;
            private  int[] date;
    
            public void setId(int id){
                this.id = id;
            }
            public int getId(){
                return id;
            }
            public void setName(String name){
                this.name = name;
            }
            public String getName(){
                return  name;
            }
            public void setSex(String sex){
                this.sex = sex;
            }
            public String getSex(){
                return sex;
            }
            public void  setAge(int age){
                this.age = age;
            }
            public int getAge(){
                return age;
            }
            public void setHeight(int height){
                this.height = height;
            }
            public int getHeight(){
                return height;
            }
            public void setDate(int[] date){
                this.date = date;
            }
            public int[] getDate(){
                return date;
            }
        }
    
        public String tostring(){
            String str = "";
            for (int i = 0;i<student.size();i++){
                str += student.get(i).getId() + " " + student.get(i).getName() + " " + student.get(i).getSex() + " " + student.get(i).getAge() + " " + student.get(i).getHeight() ;
                for (int j = 0;j<student.get(i).getDate().length;j++) {
                    str += student.get(i).getDate()[j]+ " " ;
                }
                str += "
    ";
            }
            str += "
    "+getGrade();
            return str;
        }
    }
    
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    步骤2:利用Jackson方法进行解析

    package scut.learnjackson;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import org.codehaus.jackson.map.ObjectMapper;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ObjectMapper objectMapper = new ObjectMapper();
            try {
                InputStreamReader isr = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("assets/" + "student.json"),"utf-8");
                //从assets获取json文件
                BufferedReader bfr = new BufferedReader(isr);
                String line;
                StringBuilder stringBuilder = new StringBuilder();
                while ((line = bfr.readLine())!=null){
                    stringBuilder.append(line);
                }//将JSON数据转化为字符串
                System.out.println(stringBuilder.toString());
                System.out.println(tes.tostring());
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    
    }
    
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    基于文档驱动解析方式

    • 主流方式:Android Studio自带org.json解析
    • 解析方式:基于文档驱动。相似于XML的DOM解析方法。先把全部文件读入到内存中。然后遍历全部数据。然后依据须要检索想要的数据。

    须要解析的JSON数据:

    {
    "student":[
                {"id":1,"name":"小明","sex":"男","age":18,"height":175},
                {"id":2,"name":"小红","sex":"女","age":19,"height":165},
                {"id":3,"name":"小强","sex":"男","age":20,"height":185}
              ],
    "cat":"it"
    }
    
    
    
    
    
    <div class="se-preview-section-delimiter"></div>
    

    读入本地assets文件夹里面的student.son并解析

    package scut.learngson;
    
    import android.os.Bundle;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            EntityStudent student = new EntityStudent();
    
    
            try {
                //从assets获取json文件
                InputStreamReader isr = new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream("assets/" + "student.json"));
                //字节流转字符流
               BufferedReader bfr = new BufferedReader(isr);
                String line ;
                StringBuilder stringBuilder = new StringBuilder();
                while ((line = bfr.readLine())!=null){
                    stringBuilder.append(line);
                }//将JSON数据转化为字符串
                JSONObject root = new JSONObject(stringBuilder.toString());
                //依据键名获取键值信息
                System.out.println("root:"+root.getString("cat"));
                JSONArray array = root.getJSONArray("student");
                for (int i = 0;i < array.length();i++)
                {
                    JSONObject stud = array.getJSONObject(i);
                    System.out.println("------------------");
                    System.out.print("id="+stud.getInt("id")+ ","));
                    System.out.print("name="+stud.getString("name")+ ","));
                    System.out.print("sex="+stud.getString("sex")+ ","));
                    System.out.print("age="+stud.getInt("age")+ ","));
                    System.out.println("height="+stud.getInt("height")+ ","));
                    bfr.close();
                    isr.close();
                    is.close();//依次关闭流
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    GSON、Jackson、Android Studio自带org.json解析三类方式对照

    Android Studio自带org.json
    - 原理:基于文档驱动
    - 特点:
    长处:无
    缺点:解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中并创建新对象。比較消耗时间和内存,解析速度和效率慢。解析方式和性能完败GSON

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

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


    与XML解析对照

    对于相同作为主流的数据交换格式来说。JSON相比于XML,JSON文档大小更加小,解析方法更加简单、读写速度更快,所以JSON一定是你在数据交换格式的选型中的首选。


    总结

    本文对现今主流的传输数据格式JSON进行了全面介绍。接下来我会继续介绍Android开发中的相关知识。欢迎关注Carson_Ho的CSDN博客

    这里写图片描写叙述

    总结

    本文对现今主流的传输数据格式JSON进行了全面介绍。

    接下来我会继续介绍Android开发中的相关知识。有兴趣能够继续关注Carson_Ho的安卓博客


    请帮顶 / 评论点赞!

    由于你的鼓舞是我写作的最大动力!

  • 相关阅读:
    Python入门11 —— 基本数据类型的操作
    Win10安装7 —— 系统的优化
    Win10安装6 —— 系统的激活
    Win10安装5 —— 系统安装步骤
    Win10安装4 —— 通过BIOS进入PE
    Win10安装2 —— 版本的选择与下载
    Win10安装1 —— 引言与目录
    Win10安装3 —— U盘启动工具安装
    虚拟机 —— VMware Workstation15安装教程
    Python入门10 —— for循环
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7151183.html
Copyright © 2011-2022 走看看