Android学习手册:JSON解析工具比较
JSON是一種輕量級的數(shù)據(jù)交換格式,具有良好的可讀性和便于快速編寫的特性。可以在不同的平臺間進行數(shù)據(jù)交換。JSON是JavaScript對象表示語法的子集。JSON的值由數(shù)字(整數(shù)或浮點數(shù))、字符串(在雙引號內(nèi))、邏輯值(true或false)、數(shù)組(使用方括號[]包圍)、對象(使用花括號{}包圍)、null等組成,JSON中有且只有兩種結(jié)構(gòu):對象和數(shù)組。
- 對象:在JSON數(shù)據(jù)中是{ }括起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為{key:value,key:value,…}的鍵值對結(jié)構(gòu)。在面向?qū)ο蟮恼Z言中,key為對象的屬性,value為對應(yīng)的屬性值,屬性值的類型可以是數(shù)字、字符串、數(shù)組、對象等。
 - 數(shù)組:在JSON中是[ ]擴起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為[“java”,“c”,“c++”,…],使用索引獲取值,字段值的類型可以是數(shù)字、字符串、數(shù)組、對象等。
 
Android解析JSON數(shù)據(jù)的方法和XML解析類似,主要有兩種: 基于事件驅(qū)動和基于文檔驅(qū)動解析方式
- 基于事件驅(qū)動
主流方式:Gson解析和Jackson解析 - 基于文檔驅(qū)動
主流方式:Android Studio自帶org.json解析
解析方式:基于文檔驅(qū)動,類似于XML的DOM解析方法,先把全部文件讀入到內(nèi)存中,然后遍歷所有數(shù)據(jù),然后根據(jù)需要檢索想要的數(shù)據(jù)。 
一、json-lib
json-lib最開始的也是應(yīng)用最廣泛的json解析工具,json-lib 不好的地方確實在于依賴于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,對于復(fù)雜類型的轉(zhuǎn)換,json-lib對于json轉(zhuǎn)換成bean還有缺陷,比如一個類里面會出現(xiàn)另一個類的list或者map集合,json-lib從json到bean的轉(zhuǎn)換就會出現(xiàn)問題。
json-lib在功能和性能上面都不能滿足現(xiàn)在互聯(lián)網(wǎng)化的需求。
二、Jackson
相比json-lib框架,Jackson所依賴的jar包較少,簡單易用并且性能也要相對高些。而且Jackson社區(qū)相對比較活躍,更新速度也比較快。
Jackson對于復(fù)雜類型的json轉(zhuǎn)換bean會出現(xiàn)問題,一些集合Map,List的轉(zhuǎn)換出現(xiàn)問題。
Jackson對于復(fù)雜類型的bean轉(zhuǎn)換Json,轉(zhuǎn)換的json格式不是標準的Json格式。
解析原理:
 基于事件驅(qū)動,與GSON相同,先創(chuàng)建一個對應(yīng)于JSON數(shù)據(jù)的JavaBean類就可以通過簡單的操作解析出所需JSON數(shù)據(jù)。但和Gson解析不同的是,GSON可按需解析,即創(chuàng)建的JavaBean類不一定完全涵蓋所要解析的JSON數(shù)據(jù),按需創(chuàng)建屬性,但Jackson解析對應(yīng)的JavaBean必須把Json數(shù)據(jù)里面的所有key都有所對應(yīng),即必須把JSON內(nèi)的數(shù)據(jù)所有解析出來,無法按需解析。但Jackson的解析速度和效率都要比GSON高
三、org.json
org.json為官方提供的JSON數(shù)據(jù)解析方法,解析代碼非常簡單。由于JSON數(shù)據(jù)只有JSON對象和JSON數(shù)組兩種結(jié)構(gòu),因此org.json包提供了JSONObject和JSONArray兩個類對JSON數(shù)據(jù)進行解析。
- 使用JSONObject來解析JSON對象
 - 使用JSONArray來解析JSON數(shù)組
 
將服務(wù)器返回的JSON數(shù)據(jù)傳入一個JSONObject對象中,然后循環(huán)遍歷這個JSONArray,從中取出的每一個數(shù)據(jù)都是JSONObject對象,接下來調(diào)用getString()方法將JSONObject對象所包含的數(shù)據(jù)取出。
四、GSON(Google)
Gson是目前功能最全的Json解析神器,Gson當初是為因應(yīng)Google公司內(nèi)部需求而由Google自行研發(fā)而來,但自從在2008年五月公開發(fā)布第一版后已被許多公司或用戶應(yīng)用。
Gson的應(yīng)用主要為toJson與fromJson兩個轉(zhuǎn)換函數(shù),無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
而在使用這種對象轉(zhuǎn)換之前,需先創(chuàng)建好對象的類型以及其成員,才能成功的將JSON字符串成功轉(zhuǎn)換成相對應(yīng)的對象。
類里面只要有g(shù)et和set方法,Gson完全可以將復(fù)雜類型的json到bean或bean到j(luò)son的轉(zhuǎn)換,是JSON解析的神器。
Gson在功能上面無可挑剔,但是性能上面比FastJson有所差距。
GSON特點:
- 快速、高效
 - 代碼量少、簡潔
 - 面向?qū)ο?/li>
 - 數(shù)據(jù)傳遞和解析方便
 
GSON解析的關(guān)鍵是重點是要根據(jù)json數(shù)據(jù)里面的結(jié)構(gòu)寫出一個對應(yīng)的javaBean,規(guī)則是:
- JSON的大括號對應(yīng)一個對象,對象里面有key和value(值)。在JavaBean里面的類屬性要和key同名。
 - JSON的方括號對應(yīng)一個數(shù)組,所以在JavaBeanBean里面對應(yīng)的也是數(shù)組,數(shù)據(jù)里面可以有值或者對象。
 - 如果數(shù)組里面只有值沒有key,就說明它只是一個純數(shù)組,如果里面有值有key,則說明是對象數(shù)組。純數(shù)組對應(yīng)JavaBean里面的數(shù)組類型,對象數(shù)組要在Bean里面建立一個內(nèi)部類,類屬性就是對應(yīng)的對象里面的key,建立了之后要創(chuàng)建一個這個內(nèi)部類的對象,名字對應(yīng)數(shù)組名。
 - 對象里面嵌套對象時候,也要建立一個內(nèi)部類,和對象數(shù)組一樣,這個內(nèi)部類對象的名字就是父對象的key。
 
注:JavaBean類里的屬性不一定要全部和JSON數(shù)據(jù)里的所有key相同,可以按需取數(shù)據(jù),也就是你想要哪種數(shù)據(jù),就把對應(yīng)的key屬性寫出來,注意名字一定要對應(yīng)
五、FastJson(阿里巴巴)
Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發(fā)。
無依賴,不需要例外額外的jar,能夠直接跑在JDK上。
FastJson在復(fù)雜類型的Bean轉(zhuǎn)換Json上會出現(xiàn)一些問題,可能會出現(xiàn)引用的類型,導(dǎo)致Json轉(zhuǎn)換出錯,需要制定引用。
FastJson采用獨創(chuàng)的算法,將parse的速度提升到極致,超過所有json庫。
FastJson特點:
- 快速FAST(比其它任何基于Java的解析器和生成器更快,包括jackson)
 - 強大(支持普通JDK類包括任意JavaBean Class、Collection、Map、Date或enum)
 - 零依賴(沒有依賴其他任何類庫除了JDK)
 - 支持注解、支持全類型序列化
 
六、總結(jié)
綜上5種Json技術(shù)的比較,在項目選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種并行使用,如果只是功能要求,沒有性能要求,可以使用google的Gson,如果有性能上面的要求可以使用Gson將bean轉(zhuǎn)換json確保數(shù)據(jù)的正確,使用FastJson將Json轉(zhuǎn)換Bean。
總結(jié)
以上是生活随笔為你收集整理的Android学习手册:JSON解析工具比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 虚拟服务器问题,虚拟主机常见的五大问题
 - 下一篇: 7zip File: How to Un