詳細JSON解析教程
1. 了解JSON
簡介:JSON(JavaScript Object Notation),即JS對象簡譜 , 是一種輕量級的數(shù)據(jù)交換格式。
進一步理解:
- JSON和JavaScript的關(guān)系:兩者之間的關(guān)系就是雷鋒和雷鋒塔的關(guān)系,兩者之間沒有什么關(guān)系;
- 數(shù)據(jù)交換格式:實現(xiàn)客戶端與服務(wù)器之間的數(shù)據(jù)交換,當時通用的數(shù)據(jù)交換語言是XML,但是Douglas crockford覺得xml的生成和解析都太麻煩,所以他提出了一種簡化格式,也就是json;(更具體見4.JSON解析)
- 輕量級是對比而言的,JSON 簡單的語法格式和清晰的層次結(jié)構(gòu)明顯要比 XML 容易閱讀,并且在數(shù)據(jù)交換方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得節(jié)約傳輸數(shù)據(jù)所占用得帶寬。
2.JSON對象格式
試著用不同的語言描述一本書(對象):書名+內(nèi)容,能夠看出JSON在輕量級這塊的優(yōu)勢
Java
Public class Test { public static void main() { Book b = new Book(); b.setName(“金蘋果”); b.setInfo(“種蘋果好辛苦”); } } class Book { private String name; private String info; 構(gòu)造方法; get/set方法... }
JavaScript
var b = new Object(); b.name = "金蘋果"; b.info = "種蘋果好辛苦";
XML
<book> <name>金蘋果</name> <info>種蘋果好辛苦</info> </book>
JSON
{ "name":"金蘋果", "info":"種蘋果好辛苦" }
3.JSON語法格式(建議結(jié)合案例對比著看)
- 一個對象由一個大括號表示,大括號中通過鍵值對來描述對象的屬性 (可以理解為,大括號中,包含的是一個個的鍵值對);
- 鍵與值之間使用冒號連接,多個鍵值對之間使用逗號分隔;
- 鍵值對的鍵應(yīng)使用引號引住 (通常Java解析時,鍵不使用引號會報錯。而JS能正確解析);
- 鍵值對的值, 可以是JS中的任意類型的數(shù)據(jù);
- 數(shù)組格式:[元素1,元素2…];
- 在JSON格式中可以互相嵌套,比如對象1里出現(xiàn)數(shù)組1,數(shù)組1里又出現(xiàn)對象2。
案例
{ "name":"種水果", "info":"種水果好辛苦", "fruit":["蘋果","香蕉",{ "name":"西瓜", "info":"無籽西瓜" }], "haha":{ "name":"大長刀", "length":"40cm" } }
4.JSON解析
Java用JSON做什么?上面也說過了,用來實現(xiàn)數(shù)據(jù)交換。我們知道JSON存的數(shù)據(jù)類型是字符串,并且這個字符串由一個個鍵值對組成,像極了Java對象里屬性和值的關(guān)系。我們想能不能通過某種辦法把JSON字符串變成Java相應(yīng)的對象、實現(xiàn)對數(shù)據(jù)方便地操作呢?或者我們想把Java對象的信息變成JSON字符串展示給別人看呢?下面引入JSON解析的概念。
- 序列化:將Java中的對象快速的轉(zhuǎn)換為 JSON格式的字符串。
- 反序列化:將JSON格式的字符串, 轉(zhuǎn)換為Java的對象。
Java官方?jīng)]有提供JSON解析相應(yīng)的API,本文提供兩個最常用的JSON解析方法,分別是Google的Gson,阿里的FastJson,使用JSON解析之前要先獲取相應(yīng)的jar包。
Gson解析
- 將對象轉(zhuǎn)換為JSON字符串,步驟:
引入jar包
在需要轉(zhuǎn)換JSON字符串的位置編寫如下代碼即可: String json = new Gson().toJSON(要轉(zhuǎn)換的對象);
案例
Book b = new Book("金蘋果","講述了種植蘋果的心酸歷程",20,100); String json = new Gson().toJson(b); System.out.println(json);
輸出結(jié)果
{"name":"金蘋果","info":"講述了種植蘋果的心酸歷程","prize":20,"page":100}
將JSON字符串轉(zhuǎn)換為對象,步驟:
1.引入jar包
2.在需要轉(zhuǎn)換Java對象的位置, 編寫如下代碼: 類型 對象 = new Gson().fromJson(JSON字符串,對象類型.class);
案例1
String json1 = "{\"name\":\"金蘋果\",\"info\":\"講述了種植蘋果的心酸歷程\",\"prize\":10,\"page\":100}"; Book b1 = new Gson().fromJson(json,Book.class); System.out.println(b1.getPrize());
輸出結(jié)果
10
案例2
注意:字符串最外層有花括號’{}’,英文引號前有轉(zhuǎn)義字符\
// 如果字符串信息和對象信息不匹配 ,則字符串轉(zhuǎn)hashmap對象,因為hashmap類型也是按鍵值對存儲。 String json2 = "{\"name\":\"金蘋果\",\"info\":\"講述了種植蘋果的心酸歷程\",\"prize\":20,\"page\":100,\"content\":[\"鋤禾日當午\",\"汗滴禾下土\",\"呵呵呵呵呵\"]}"; HashMap map = new Gson().fromJson(json2,HashMap.class); System.out.println(map.get("content")); // 這里說明一下,如果字符串里有數(shù)組,轉(zhuǎn)HashMap后,數(shù)組按List存儲(動手試一下) ArrayList list = (ArrayList) map.get("content"); System.out.println(list.get(0));
輸出結(jié)果
[鋤禾日當午,汗滴禾下土,呵呵呵呵呵]
鋤禾日當午
FastJson解析
- 將對象轉(zhuǎn)換為JSON字符串,步驟:
引入jar包
在需要轉(zhuǎn)換JSON字符串的位置編寫如下代碼即可: String json=JSON.toJSONString(要轉(zhuǎn)換的對象);
案例
Book b = new Book("金蘋果","講述了種植蘋果的心酸歷程",20,100); String fastJson = JSON.toJSONString(b); System.out.println(fastJson);
輸出結(jié)果
{"info":"講述了種植蘋果的心酸歷程","name":"金蘋果","page":100,"prize":20}
將JSON字符串轉(zhuǎn)換為對象,步驟:
引入jar包
在需要轉(zhuǎn)換Java對象的位置, 編寫如下代碼: 類型 對象名=JSON.parseObject(JSON字符串, 類型.class); 或 List<類型> list=JSON.parseArray(JSON字符串,類型.class);
案例1
Book b1 = JSON.parseObject("{\"name\":\"金蘋果\",\"info\":\"講述了種植蘋果的心酸歷程\",\"prize\":20,\"page\":100}",Book.class); System.out.println(b1);
運行結(jié)果
Book{name='金蘋果', info='講述了種植蘋果的心酸歷程', prize=20, page=100}
案例2:數(shù)組轉(zhuǎn)為list集合
List<String> list = JSON.parseArray("[\"鋤禾日當午\",\"汗滴禾下土\",\"呵呵呵呵呵\"]",String.class); System.out.println(list.get(1));
運行結(jié)果
汗滴禾下土
案例3:解析一段稍微復(fù)雜的JSON案例
{ "name":"種水果", "info":"種水果好辛苦", "fruit":["蘋果","香蕉",{ "name":"西瓜", "info":"無籽西瓜" }], "haha":{ "name":"大長刀", "length":"40cm" } }
代碼
String json = "[{ "name":"種水果", "info":"種水果好辛苦", "fruit":["蘋果","香蕉",{ "name":"西瓜", "info":"無籽西瓜" }], "haha":{ "name":"大長刀", "length":"40cm" } }]"; //1. 最外層是數(shù)組格式,這里數(shù)組只包含一個元素 List<Map> list = JSON.parseArray(json,Map.class); Map map = list.get(0); String info = (String) map.get("info"); System.out.println(info); //種水果好辛苦 //2. 鍵fruit對應(yīng)的值類型是數(shù)組,用到方法toJSONString()將數(shù)組轉(zhuǎn)成字符串格式,再進行解析 String fruit = JSON.toJSONString(map.get("fruit")); List<String> list1 = JSON.parseArray(fruit,String.class); System.out.println(list1.get(0)); //蘋果 // 字符串轉(zhuǎn)對象 Map map1 = JSON.parseObject(list1.get(2),Map.class); System.out.println(map1.get("info")); //無籽西瓜
運行結(jié)果
總結(jié)
- JSON解析無非就兩種情況:序列化和反序列化,序列化簡單一些,反序列化注意一下對象的類型;
- 最外層對這里的字符串加了"[]",初試為數(shù)組;
- toJSONString()方法,實現(xiàn)數(shù)組向字符串的轉(zhuǎn)化;
- 建議動手敲一下代碼,體會更深一些。
參考資料
到此這篇關(guān)于詳細Java JSON解析教程的文章就介紹到這了,更多相關(guān)json解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
趁熱打鐵!HTTPGet與HTTPPost的區(qū)別詳解
這篇文章主要介紹了趁熱打鐵!HTTPGet與HTTPPost的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10從學習到接單賺錢 十大網(wǎng)絡(luò)技術(shù)人員推薦收藏的網(wǎng)站
這篇文章主要介紹了從學習到接單賺錢 十大網(wǎng)絡(luò)技術(shù)人員推薦收藏的網(wǎng)站,需要的朋友可以參考下2015-08-08