1. 程式人生 > >一篇文章讓你學會json和Gson---json全面詳細解析

一篇文章讓你學會json和Gson---json全面詳細解析

現在企業越來越多的使用json返回資料,因此熟練使用json解析,是程式設計師必不可少的技能。

一、對json的理解

1)JSON(JavaScript Object Notation, js 物件標記) (javascript 物件標記語言) 是一種輕量級的資料交換格式。

易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
JSON是JS物件的字串表示法,它使用文字表示一個 JS 物件的資訊,本質是一個字串。

簡單地說JSON可以將 JavaScript物件中表示的一組資料轉換為字串,然後就可以在網路或者程式之間輕鬆地傳遞這個字串,並在需要的時候將它還原為各程式語言所支援的資料格式。

2)基本規則

物件表示為鍵值對

資料由逗號分隔

花括號儲存物件

方括號儲存陣列

1、表示物件
JSON最常用的格式是物件的 鍵值對。例如下面這樣:
整個{}為一個json物件,然後內部是屬性鍵值對。

{"name": "Tom", "age": "18"}

2、表示陣列
和普通的 JS 陣列一樣,JSON 表示陣列的方式也是使用方括號 []。
一個json物件內部,people的值是一個json物件,這個json物件裡面包括兩個json物件。

{    
"people":[         
{ 
"name": "小明",             
"age
":"10" }, { "name":"小紅", "age":"9" } ]
}

3、巢狀 JSON 物件
JSON 物件中可以包含另外一個 JSON 物件:
例項

myObj = {
    "name":"runoob",
    "alexa":10000,
    "sites": {
        "site1":"www.runoob.com",
        "site2":"m.runoob.com",
        "site3":"c.runoob.com"
    }
}

3)json物件的屬性值獲取和修改

1、和Java物件一樣,json也能通過”.”獲取物件的屬性值

 var myObj, x; 
myObj = { “name”:”runoob”, “alexa”:10000, “site”:null }; 
x = myObj.name;

你也可以使用中括號([])來訪問物件的值:
例項

 var myObj, x; 
myObj = myObj = { “name”:”runoob”, “alexa”:10000, “site”:null }; 
x = myObj[“name”];

2、巢狀 JSON

“name”:”runoob”, 
“alexa”:10000, 
“sites”: { 
“site1”:”www.runoob.com”, 
“site2”:”m.runoob.com”, 
“site3”:”c.runoob.com” 
}

點號(.)或者中括號([])來訪問巢狀的 JSON 物件。

x = myObj.sites.site1;
// 或者
x = myObj.sites["site1"];

修改json物件屬性值

  delete myObj.sites.site1;

myObj.sites.site1 = “www.google.com”;

myObj.sites[“site1”] = “www.google.com”;
刪除物件屬性
我們可以使用 delete 關鍵字來刪除 JSON 物件的屬性:

  delete myObj.sites.site1;

你可以使用中括號([])來刪除 JSON 物件的屬性:

  delete myObj.sites.site1;

delete myObj.sites[“site1”]
物件屬性的值是一個數組時候,也可以通過通過.進行索引和刪除工作。

二、解析基礎原則

在json解析中,應該用對應的資料型別去接收解析出來的資料。
比如 JSONObject : josn物件,
JSONArray: json陣列。

1、JSONObject
用於接收json物件,只要是解析出來是{ },就用JSONObject接收。

  JSONObject jsonObject = new JSONObject(jsonString);

內部屬性值是json物件也是這樣接收。

2、JSONArray

json陣列,用於接收json陣列,只要解析出來是[ ],都用JSONArray接收。

JSONArray  jsonArray = jsonObject.getJSONArray(key);

3、基本資料型別和引用資料型別

int ,string等,就用相應資料型別接收。

三、傳統解析

1.bean類解析:

單個物件解析。

public static Person getPerson(String key, String jsonString) {

  Person person = new Person();//例項化bean類
  try {
  //把對應資料賦值給bean類
   JSONObject jsonObject = new JSONObject(jsonString);
   JSONObject personObject = jsonObject.getJSONObject("person");
   person.setId(personObject.getInt("id"));
   person.setName(personObject.getString("name"));
   person.setAddress(personObject.getString("address"));
  } catch (Exception e) {
   // TODO: handle exception
  }
  return person;
 }

2.返回list

大多數情況下,我們的資料不是一條,而是很多資料,我們需要迴圈,新增到list集合裡面。

 public static List getPersons(String key, String jsonString) {
  List list = new ArrayList();
  try {
   JSONObject jsonObject = new JSONObject(jsonString);
   // 返回json的陣列
   JSONArray jsonArray = jsonObject.getJSONArray(key);

   for (int i = 0; i < jsonArray.length(); i++) {

    JSONObject jsonObject2 = jsonArray.getJSONObject(i);
    Person person = new Person();
    person.setId(jsonObject2.getInt("id"));
    person.setName(jsonObject2.getString("name"));
    person.setAddress(jsonObject2.getString("address"));
    list.add(person);
   }
  } catch (Exception e) {
   // TODO: handle exception
  }
  return list;

3.返回list

有時候服務端可能需要傳多多個集合的資料,每組資料放到一個map集合裡面,以key,value形式(value是map集合)存在於json裡面。解析如下:

 public static List<map> listKeyMaps(String key,String jsonString) {

  List<map> list = new ArrayList<map>();
  try {

   JSONObject jsonObject = new JSONObject(jsonString);
   JSONArray jsonArray = jsonObject.getJSONArray(key);
   for (int i = 0; i < jsonArray.length(); i++) {

    JSONObject jsonObject2 = jsonArray.getJSONObject(i);
    Map map = new HashMap();
    Iterator iterator = jsonObject2.keys();
    while (iterator.hasNext()) {
     String json_key = iterator.next();
     Object json_value = jsonObject2.get(json_key);
     if (json_value == null) {
      json_value = "";
     }
     map.put(json_key, json_value);
    }
    list.add(map);
   }
  } catch (Exception e) {
   // TODO: handle exception
  }
  return list;
 }
}

四、Gson解析

Gson 是google解析Json的一個開源框架,同類的框架fastJson,JackJson等等

Gson可以大大節約解析程式碼

新增gson依賴

compile 'com.google.code.gson:gson:2.6.2'

1、物件和json互相轉化

物件轉化為json 字串

  public static String createJsonObject(Object obj) {
  Gson gson = new Gson();
  String str = gson.toJson(obj);
  return str;
 }

json字串轉換為JavaBean類

Gson gson = new Gson();
Student student = gson.fromJson(studentJsonStr, Student.class);

2、 Json字串轉List

String listJsonStr=”[“1”,”a”,”3”,”rt”,”5”]”;

Type type = new TypeToken

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
;
public class GsonTools {
 public GsonTools() {
  // TODO Auto-generated constructor stub
 }
 /**
  * 使用Gson生成JAVA物件
  * 
  * @param jsonString
  * @param cls
  * @return
  */
 public static <T> T getObject(String jsonString, Class<T> cls) {
  if (null == jsonString || null == cls) {
  }
  T t = null;
  Gson gson = new Gson();
  try {
   t = (T) gson.fromJson(jsonString, cls);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return t;
 }
 /**
  * 使用Gson生成List物件
  * @param jsonString
  * @param cls
  * @return
  */
 public static <T> List<T> getList(String jsonString, Class<T> cls) {
  if (null == jsonString || null == cls) {
  }

  List<T> list = new ArrayList<T>();
  Gson gson = new Gson();
  try {
   Type type = new TypeToken<List<T>>() {}.getType();
   list = gson.fromJson(jsonString, type);
  } catch (Exception e) {
   e.printStackTrace();
  }

  return list;
 }
}

五其他的一些技巧

1)、JavaBean快速生成:

AndroidStudio外掛GsonFormat快速實現把Json資料轉換為JavaBean,方便資料的獲取
1. Android studio File->Settings..->Plugins–>Browse repositores..搜尋GsonFormat
2. 安裝外掛,重啟android studio
3. code裡面的Generate (或者快捷鍵alt+insert),把資料的模型放入到生成框中,就可以生成Bean的內容體了。

2)Gson註解

Gson有五種註解,這裡說一下重新命名註解
轉換關鍵字key,json轉換成JavaBean時,json欄位的key 預設必須和我們宣告類的欄位名稱一樣,當伺服器端返回了關鍵字怎麼辦,比如key 為new switch這樣,我們 在宣告類的時候不能寫這樣的欄位,可能你想伺服器端改動,他可能要改資料庫,但是我告訴你,做服務端的大部分不願意改動他的json,是很自私的!這時候重新命名註解都排上用場了 第二種場景:伺服器端返回的json 的key 簡直太醜,或者太長,你想簡化,my_parent_name,可以簡化成mpn 比較優雅簡介

public class GsonTest3 {  
    private static void log(String msg) {  
        System.out.println(msg);  
    }  

    public static class User2 {  
        public String name;  
        public int age;  
        @SerializedName("my_parent_name")  
        public String pn;  

        @Override  
        public String toString() {  
            return "User2{" +  
                    "name='" + name + '\'' +  
                    ", age=" + age +  
                    ", pn='" + pn + '\'' +  
                    '}';  
        }  
    }  

    public static void main(String[] args) throws Exception {  
        String jsonFromServer2="{\n" +  
                "    \"age\": 26,\n" +  
                "    \"my_parent_name\": \"zhangsanf\",\n" +  
                "    \"name\": \"zhangsan\"\n" +  
                "}";  
        Gson gson2 = new Gson();  
        User2 user2 = gson2.fromJson(jsonFromServer2, User2.class);  
        log("------>user2:" + user2);  
    }  
}  

@Expose註解 是過濾註解,可以過濾掉json資料,

@Since(float v)註解
@Util(float v)註解
能進行版本控制。參考

相關推薦

文章學會jsonGson---json全面詳細解析

現在企業越來越多的使用json返回資料,因此熟練使用json解析,是程式設計師必不可少的技能。 一、對json的理解 1)JSON(JavaScript Object Notation, js 物件標記) (javascript 物件標記語言) 是一種輕量級

深入淺出,文章學會Dagger2使用

本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 前言 最近在做專案中,用到了Dagger2,所以找了一些部落格並參考了菜鳥窩Ivan的視訊,算是知道如何使用了,但是對其理解還相差很遠。所以這篇文章重點針對如何使用和使用中常見的一些問題

#Java乾貨分享:文章深入瞭解Java中的包介面

很多新手程式設計師對於Java中兩個具創新性的特徵————包與介面不是非常清楚,所以我特意發了這篇文章來闡述什麼是包,什麼是介面。 包(package)是多個類的容器,它們用於保持類的名稱空間相互隔離。 如果有想學習java的程式設計師,可來我們的java學習扣qun:79979,2590免

分享文章,知道計算機為什麼認識01

當運算啟動時,首先動作的是CPU的CU,它接到了來自I/O裝置或其他裝置的請求,於是開始行動,首先將PC中的值傳送給主存的MAR,於是MAR會按照這個地址去尋找主存內的資料,找到後MDR會將這段資料傳給IR,(由一串表示操作型別的數字和一串表示操作的物件的數字組成,這兩組數字是連在一起傳給IR的,CU有可靠的

文章徹底理解java中抽象類介面

目錄 1、我所理解的抽象類 2、我所理解的介面 3、抽象類和介面本質區別 相信大家都有這種感覺:抽象類與介面這兩者有太多相似的地方,又有太多不同的地方。往往這二者可以讓初學者摸不著頭腦,無論是在

文章搞懂原型原型鏈

本文由葡萄城技術團隊原創並首發 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。   與多數面向物件的開發語言有所不同,雖然JavaScript沒有引入類似類的概念(ES6已經引入了class語法糖),但它仍然能夠大量的使用物件,那麼如何將所有物件聯絡起

文章讀懂什麽是餐飲小程序

用戶 事情 right 連接 不用 距離 掃描二維碼 left 企業 小程序火了,餐飲+小程序也火了! 作為連接線下消費場景和線上營銷的新工具,小程序出現後,迅速贏得了餐飲商家的青睞。與其說,小程序對餐飲行業“情有獨鐘”;不如說,兩者是“情投意合”。 20天

文章明白python的裝飾器

pri 9.png 不同 概念 ota 一起 數字 上下文 讀取 在看閉包問題之前先來看看關於python中作用域的問題 變量作用域 對於上述代碼中出現錯誤,肯定沒什麽疑問了,畢竟b並沒有定義和賦值,當我們把代碼更改如下後: 再看一個例子: 首先這個錯誤已經非常明顯

文章了解DNS

遞歸查詢 叠代查詢 反向解析 DNS報文格式 目錄什麽是DNSDNS的特點DNS的工作原理反向解析DNS的報文格式一、什麽是DNS DNS--Domain Name System,域名系統。 互聯網中計算機之間進行通訊,數據怎麽走,走向哪裏,這些都需要根據IP地址來

文章知道什麽是數據挖掘

大數據 數據挖掘 數據庫 大數據如果想要產生價值,對它的處理過程無疑是非常重要的,其中大數據分析和大數據挖掘就是最重要的兩部分。在前幾期的科普中,小編已經為大家介紹了大數據分析的相關情況,本期小編就為大家講解大數據挖掘技術,讓大家輕輕松松弄懂什麽是大數據挖掘技術。什麽是大數據挖掘?數據挖掘(Dat

文章豁然開朗,成為架構師必須了解的一些疑問

有一點 同事 繼續 模式 常見 瓶頸 功能實現 很多 獨立 前言:我先介紹一下我的新同事,公司好多同事都這麽叫他James,有10年開發經驗的架構師,之前在人人網待過,之後我們也聊了很多。 在聊天過程中,我們也聊到了他為什麽離開人人網,也聊到了他在成為架構師的道路上的辛酸歷

文章快速入門 學懂Shell腳本

運行 turn origin 判斷語句 load for循環 網絡操作 場景 個數字 Shell腳本,就是利用Shell的命令解釋的功能,對一個純文本的文件進行解析,然後執行這些功能,也可以說Shell腳本就是一系列命令的集合。 Shell可以直接使用在win/Uni

止損不見得能控制住回撤,文章認清自己的止損!

結果 股票 部分 接下來 ESS 我希望 錯誤 占比 被套 首發:寬客在線 NO:01文字並不具備精確傳遞信息的能力。除了程序員和律師等少數群體,很少人能保證自己說的東西能在一句話中被清晰傳遞的。所以,帶著思考閱讀從而幫助完善你的知識體系,改變你的行為,這才是您耗費時間,閱

文章瞭解GC垃圾回收器

簡單瞭解GC垃圾回收器 瞭解GC之前我們首先要了解GC是要做什麼的?顧名思義回收垃圾,什麼是垃圾呢? GC回收的垃圾主要指的是回收堆記憶體中的垃圾物件。 從根物件出發,所有被引用的物件,都是存活物件 其他物件,都是垃圾物件。  根物件:    棧中的引用變數,所引用的物

文章了解GC垃圾回收器

存滿 需要 進行 並行 mil 之間 consola 微軟雅黑 並行執行 簡單了解GC垃圾回收器 了解GC之前我們首先要了解GC是要做什麽的?顧名思義回收垃圾,什麽是垃圾呢? GC回收的垃圾主要指的是回收堆內存中的垃圾對象。 從根對象出發,所有被引用的對象,都是存活對象 其

文章真正讀懂HashMap

前言------ 在使用HashMap的過程中,是否對key值不能重複有過疑問? 是否對改原因百思不得其解? 是否只會使用常用方法?  是否很想理解hash演算法為基礎的HashMap?  如果有, 那麼恭喜你哈, 找對文章了! 歡迎轉載,轉載請註明來源  

文章瞭解大資料採集技術

大資料開啟了一個大規模生產、分享和應用資料的時代,它給技術和商業帶來了巨大的變化。麥肯錫研究表明,在醫療、零售和製造業領域,大資料每年可以提高勞動生產率0.5-1個百分點。大資料在核心領域的滲透速度有目共睹,然而調查顯示,未被使用的資訊比例高達99.4%,很大程度都是由於高價值的資訊無法獲取採集。因

#文章瞭解四種執行緒池,學習Java不在困惑

在Java開發中,有時遇到多執行緒的開發時,直接使用Thread操作,對程式的效能和維護上都是一個問題,使用Java提供的執行緒池來操作可以很好的解決問題,於是找了下API看到Java提供四種執行緒池使用,Java通過Executors提供四種執行緒池,分別為: 1、newCachedThrea

文章不再擔心浮動

浮動的效果 文件流 文件流是文件中可顯示物件在排列時所佔用的位置。 將窗體自上而下分成一行行, 並在每行中按從左至右的順序排放元素,即為文件流.(自己的理解是從頭到尾按照文件的順序,該在什麼位置就在什麼位置,也可以按照上面的意思理解,自上而下,自左到右的順序) 浮動的特點