1. 程式人生 > >JSON介紹及Android最全面解析方法(Gson、AS自帶org.son、Jackson解析)

JSON介紹及Android最全面解析方法(Gson、AS自帶org.son、Jackson解析)

這裡寫圖片描述

前言

今天,我們來介紹一下現今主流的資料交換格式-JSON!

目錄

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,而解析過程非常簡單:

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 += "\n";
        }
        str += "\n"+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的安卓部落格

請幫頂 / 評論點贊!

因為你的鼓勵是我寫作的最大動力!

相關推薦

JSON介紹Android全面解析方法(GsonASorg.sonJackson解析)

前言 今天,我們來介紹一下現今主流的資料交換格式-JSON! 目錄 定義 JavaScript Object Notation,JavaScript的物件表示法,是一種輕量級的文字資料交換格式。 作用 用於資料的標記、儲存

Android開發:JSON簡介全面解析方法(GsonASorg.jsonJackson解析)

目錄 JSON簡介&解析方法介紹.png 定義 JavaScript Object Notation,JavaScript的物件表示法,是一種輕量級的文字資料交換格式。 作用 用於資料的標記、儲存和傳輸。 特點 輕量級的文字資料交換格式 獨立於語言和平臺 具有自我描述性 讀寫速度快,解析簡單 語法

java中URI,URL,URL介紹Android中Uri解析

一、URI 1.1 定義 在電腦術語中,統一資源識別符號(Uniform Resource Identifier,即URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對任何(包括本地和網際網路)的資源通過特定的協議進行互動操作。 1.2 組成 一般格式為:

Android Studio中的快捷鍵介紹設定快捷鍵的方法

本頁內容: 1.Android Studio中的快捷鍵介紹 2.設定快捷鍵 1.Android Studio中的快捷鍵介紹 操作 在Win平臺下的快捷鍵 在Mac OSX平臺下的快捷鍵

gulp介紹常用插件使用方法

extension 加載 lin 邏輯 了解 compile progress 瀏覽器 path gulp是前端開發過程中對代碼進行自動化構建的利器。它不僅能對資源進行優化,而且在開發過程中能夠通過配置自動完成很多重復的任務,讓我們可以專註於代碼,提高工作效率。 一、API

斐波那契數列介紹Python中五種方法斐波那契數列

Q:斐波那契數列為什麼那麼重要,所有關於數學的書幾乎都會提到? A:因為斐波那契數列在數學和生活以及自然界中都非常有用。 1. 斐波那契數列 概念引入 斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家列昂納多·斐波那契(Leonar

一文讀懂 AOP | 你想要的全面 AOP 方法探討

前前言 相信大家在入門 AOP 時,常常被繁多的術語、方法和框架繞暈。AOP 好像有點耳熟?Javaseopt 是個什麼?Javassist 又是啥?Dexposed、APT 也是 AOP?本篇將輔助你快速理清概念,掌握 AOP 思想,找到最適合自己業務場景的 AOP 方法。 前言 上

Python中面向對向介紹類的屬性和方法

1.面向物件介紹 類和物件:是面向物件中兩個重要概念 類:是物件對事物的抽象,比如人類\球類 物件:是類的一個例項,比如足球\籃球 例項說明: 球類可以對球的特徵和行為進行抽象,然後可以例項化一個真實的球體出來 為什麼面向物件? 面向物件的主要思想是 封裝

目前Android全面易懂的Android螢幕適配解決方案

前言 Android的螢幕適配一直以來都在折磨著我們Android開發者,本文將結合: 給你帶來一種全新、全面而邏輯清晰的Android螢幕適配思路,只要你認真閱讀,保證你能解決Android的螢幕適配問題! 目錄 Androi

Json介紹Jsoncpp簡單使用(測試程式碼+測試例項)

Json介紹及Jsoncpp簡單使用 Json介紹 JSON是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Editi

NAT介紹iptables配置NAT的方法

NAT,網路地址轉換,該技術是為了應對IPv4地址耗盡的問題而產生的。他的產生幾乎使IPv4起死回生。在IPv4已經被認為行將結束歷史使命之後近20年時間裡,人們幾乎忘了IPv4的地址空間即將耗盡這樣一個事實。 IPv4地址的劃分 在弄明白NAT的具體功能前,我們先來看一看IPv4地址的劃分。 IPv

json介紹應用

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,採用完全獨立於語言的文字格式,是理想的資料交換格式。同時,JSON是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON資料不須要任何特殊的 API 或工具包。     本文主要是對

Qt 之 模態非模態半模態視窗的介紹 實現QDialog的exec()方法

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/

不啟動Android Studio單獨啟動AS的模擬器

       最近學習React Native的時候,寫完需要用模擬器測試(不用手機執行的時候),但每次都要先啟動Android Studio在啟動模擬器,多操作兩次顯得非常麻煩, 所以需要檢視自己電腦sdk位置和模擬器名稱來一鍵執行執行: 1.找

第三方軟體正確驗證163/126郵箱最新方法(使用iPhone的郵件做示例)

近期我手機上的163/126郵箱突然無法通過驗證、收發郵件,郵件下方顯示如下的資訊: 在網上查了很久,始終沒有找到真正有效、詳細的方法,後來自己摸索了好久,終於發現瞭解決的辦法。 1. 首先進入網易郵箱網易網頁版 2.進入設定,圖中紅框內的

Android螢幕錄製AS功能

用了這麼久AS,以前都是用專門下個錄製軟體,今天使用了AS(AndoirdStuido)的螢幕錄製功能。介紹下如下: 1.在哪裡使用? 開啟模擬器或者真機點選這裡,並且保證ADB連線上了。就能使用 2.怎麼設定? 點選上述圖示後 bit

Android彈出對話方塊--Alertdialog(系統的)

一. 我們在平時做開發的時候,免不了會用到各種各樣的對話方塊,相信有過其他平臺開發經驗的朋友都會知道,大部分的平臺都只提供了幾個最簡單的實現,如果我們想實現自己特定需求的對話方塊,大家可能首先會想到,通過繼承等方式,重寫我們自己的對話方塊。當然,這也是不失為一個不錯的解決方

Delphi獲取檔名檔名不副檔名檔名的方法;delphi 獲取檔案所在路徑

取檔名 ExtractFileName(FileName); 取副檔名: ExtractFileExt(filename); 取檔名,不帶副檔名: 方法一: Function ExtractFileNameNoExt(FileString: S

搭配Android Studio的新工具,完虐模擬機型

先來個打斷點截圖,大家猜猜我是怎麼在桌面上沒有手機的情況下debug的 首先大家需要藉助這個工具: http://t.cn/R4jV3my 然後選一臺手機比如像我選的是一臺HTC 點了租用以後你會看到這個畫面 實際上你現在操作的手機是一臺真的

Android 之 tablayout+viewpager+fragment+toolbar+動態新增+navigation

效果:1、首先建立一個自帶navigation的專案2、在MainActivity裡新增下列程式碼(1)定義tablayout和viewpager(1)fragment的集合以及自定義fragment和動態新增的fragment,tablayout,viewpager。 (2