一篇文章讓你學會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)註解
能進行版本控制。參考
相關推薦
一篇文章讓你學會json和Gson---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免
分享一篇文章,讓你知道計算機為什麼認識0和1
當運算啟動時,首先動作的是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
一篇文章讓你不再擔心浮動
浮動的效果 文件流 文件流是文件中可顯示物件在排列時所佔用的位置。 將窗體自上而下分成一行行, 並在每行中按從左至右的順序排放元素,即為文件流.(自己的理解是從頭到尾按照文件的順序,該在什麼位置就在什麼位置,也可以按照上面的意思理解,自上而下,自左到右的順序) 浮動的特點