fastjsonandroid
1. android json解析三種方式哪種效率最高
用org.json以及谷歌提供gson來解析json數據的方式更好一些。
安卓下通常採用以下幾種方式解析json數據:
1、org.json包(已經集成到android.jar中了)
2、google提供的gson庫
3、阿里巴巴的fastjson庫
4、json-lib
以Google出品的Gson為例,具體步驟為:
1、首先,從 code.google.com/p/google-gson/downloads/list下載GsonAPI:
google-gson-1.7.1-release.zip 把gson-1.7.jar 到libs(項目根目錄新建一個libs文件夾)中。 可以使用以下兩種方法解析JSON數據,通過獲取JsonReader對象解析JSON數據。
代碼如下:
String jsonData = "[{\"username\":\"arthinking\",\"userId\":001},{\"username\":\"Jason\",\"userId\":002}]";
try{
JsonReader reader = new JsonReader(new StringReader(jsonData));
reader.beginArray();
while(reader.hasNext()){
reader.beginObject();
while(reader.hasNext()){
String tagName = reader.nextName();
if(tagName.equals("username")){
System.out.println(reader.nextString());
}
else if(tagName.equals("userId")){
System.out.println(reader.nextString());
}
}
reader.endObject();
}
reader.endArray();
}
catch(Exception e){
e.printStackTrace();
}
2、使用Gson對象獲取User對象數據進行相應的操作:
代碼如下:
Type listType = new TypeToken<LinkedList<User>>(){}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, listType);
for (Iterator iterator = users.iterator(); iterator.hasNext();) {
User user = (User) iterator.next();
System.out.println(user.getUsername());
System.out.println(user.getUserId());
}
3、如果要處理的JSON字元串只包含一個JSON對象,則可以直接使用fromJson獲取一個User對象:
代碼如下:
String jsonData = "{\"username\":\"arthinking\",\"userId\":001}";
Gson gson = new Gson();
User user = gson.fromJson(jsonData, User.class);
System.out.println(user.getUsername());
System.out.println(user.getUserId());
2. Android Gson 使用詳解
Json 是一種文本形式的數據交換格式,比 xml 更為輕量。Json 的解析和生成的方式很多,在 Android 平台上最常用的類庫有 Gson 和 FastJson 兩種,這里要介紹的是 Gson
Gson 的 GitHub 主頁點擊這里: Gson
在進行序列化與反序列操作前,需要先實例化一個 com .google.gson.Gson 對象,獲取 Gson 對象的方法有兩種
利用 Gson 可以很方便地生成 Json 字元串,通過使用 addProperty 的四個重載方法
addProperty 方法底層調用的是 add(String property, JsonElement value) 方法,即將基本數據類型轉化為了 JsonElement 對象,JsonElement 是一個抽象類,而 JsonObject 繼承了 JsonElement ,因此我們可以通過 JsonObject 自己來構建一個 JsonElement
Json數組 與 字元串數組
Json數組 與 List
Gson 也提供了 toJson() 和 fromJson() 兩個方法用於轉化 Model 與 Json,前者實現了序列化,後者實現了反序列化
首先,聲明一個 User 類
序列化的方法很簡單,調用 gson 對象的 toJson 方法,傳入要序列化的對象
反序化的方式也類似
繼續使用上一節聲明的 User 類,根據 User 類聲明的各個屬性名,移動端的開發者希望介面返回的數據格式即是如下這樣的
如果沒有和伺服器端溝通好或者是 API 改版了,介面返回的數據格式可能是這樣的
如果繼續使用上一節介紹的方法,那無疑會解析出錯
例如
name 屬性值解析不到,所以為 null
此時為了兼顧多種格式的數據,就需要使用 SerializedName 註解
根據 SerializedName 的聲明來看,SerializedName 包含兩個屬性值,一個是字元串,一個是字元串數組,而字元串數組含有默認值
SerializedName 的作用是為了在序列化或反序列化時,指導 Gson 如果將原有的屬性名和其它特殊情況下的屬性名聯系起來
例如,修改 User 類,為 name 聲明 SerializedName 註解,註解值為 userName
在序列時,Json 格式就會相應改變
在反序列化時也一樣,能夠解析到正確的屬性值
還有個問題沒解決,為了應對多種屬性名不一致的情況,難道我們要聲明多個 User 類嗎?這顯然是不現實的,所以還需要為 User 類設置多個備選屬性名,這就需要用到 SerializedName 註解的另一個屬性值 alternate 了。
以下幾種情況都能夠被正確的反序列化
有時候並不是所有的欄位都需要進行系列化和反序列化,因此需要對某些欄位進行排除,有四種方法可以來實現這種需求。
Expose 註解包含兩個屬性值,且均聲明了默認值。Expose 的含義即為「暴露」,即用於對外暴露欄位,serialize 用於指定是否進行序列化,deserialize 用於指定是否進行反序列化。如果欄位不聲明 Expose 註解,則意味著不進行序列化和反序列化操作,相當於兩個屬性值均為 false 。此外,Expose 註解需要和 GsonBuilder 構建的 Gson 對象一起使用才能生效。
Expose 註解的註解值聲明情況有四種
現在來看個例子,修改 User 類
按照如上的註解值,只有聲明了 Expose 註解且 serialize 值為 true 的欄位才能被序列化,只有聲明了 Expose 註解且 deserialize 值為 true 的欄位才能被反序列化
Gson 提供了 @Since 和 @Until 兩個註解基於版本對欄位進行過濾,@Since 和 @Until 都包含一個 Double 屬性值,用於設置版本號。Since 的意思是「自……開始」,Until 的意思是「到……為止」,一樣要和 GsonBuilder 配合使用。
當版本( GsonBuilder 設置的版本) 大於或等於 Since 屬性值或小於 Until 屬性值時欄位會進行序列化和反序列化操作,而沒有聲明註解的欄位都會加入序列化和反序列操作
現在來看個例子,修改 User 類
訪問修飾符由 java.lang.reflect.Modifier 提供 int 類型的定義,而 GsonBuilder 對象的 excludeFieldsWithModifiers 方法接收一個 int 類型可變參數,指定不進行序列化和反序列化操作的訪問修飾符欄位
看個例子
GsonBuilder 類包含 setExclusionStrategies(ExclusionStrategy... strategies) 方法用於傳入不定長參數的策略方法,用於直接排除指定欄位名或者指定欄位類型
看個例子
欄位名為 "intField" 和欄位類型為 double 的欄位都會被排除掉
setExclusionStrategies 方法在序列化和反序列化時都會生效,如果只是想指定其中一種情況下的排除策略或分別指定排除策略,可以改為使用以下兩個方法
對於 Gson 而言,在序列化時如果某個屬性值為 null 的話,那麼在序列化時該欄位不會參與進來,如果想要顯示輸出該欄位的話,可以通過 GsonBuilder 進行配置
默認的序列化後的 Josn 字元串並不太直觀,可以選擇格式化輸出
Gson 也可以對時間值進行格式化
TypeAdapter 是一個泛型抽象類,用於接管某種類型的序列化和反序列化過程,包含兩個抽象方法,分別用於自定義序列化和反序列化過程
下面看個簡單的例子
定義 TypeAdapter 的子類 UserTypeAdapter 來接管 User 類的序列化和反序列化過程
這里設定當 User 類序列化時 Json 中的Key值都是大寫字母開頭,反序列化時支持「name」和「Name」兩種不同的 Json 風格
可以看到 User 類按照預定義的策略來完成序列化和反序列化了
TypeAdapter 將序列化和反序列操作都接管了過來,其實 Gson 還提供了只接管序列化過程的介面,即 JsonSerializer
看個例子
相對應的,JsonDeserializer 介面提供了反序列化的介面
這里有個比較麻煩的地方,那就是在使用 TypeAdapter 、JsonSerializer 和 JsonDeserializer 時,總需要調用 registerTypeAdapter 方法進行注冊,那有沒有更簡單的注冊方法呢?
有的,Gosn 還提供了另一個註解 @JsonAdapter 用於進行簡單的聲明
類似於這樣,聲明了 User 類的序列化或反序列化操作由 UserTypeAdapter 完成,註解的優先順序高於 registerTypeAdapter 方法
TypeAdapterFactory 是用於創建 TypeAdapter 的工廠類,通過參數 TypeToken 來查找確定對應的 TypeAdapter,如果沒有就返回 null 並由 Gson 默認的處理方法來進行序列化和反序列化操作,否則就由用戶預定義的 TypeAdapter 來進行處理
這一篇文章好像寫得太長了一點?Gson 的知識點介紹到這里也差不多了,以後如果還發現新內容的話我會繼續補充,現在就先這樣啦
3. Android開發中應該使用哪一種主流json框架
Android開發中應該使用的主流json框架有三種,分別是gson、fastjson、jackson這三種。
各自的區別:
gson:谷歌開發的gson很受國內外人士常使用,不過使用率低於fastjson,耗費內存多。
fastjson:框架的fastjson是最小的,屬於老牌並且國內開發者經常使用,fastjson必須有默認的構造函數。
jackson:jackson屬於小眾開發者使用的,jackson的框架包是最大的。
4. android開發用H5哪個框架比較好
一、Adobe Edge 目前還處於預覽階段的Adobe Edge是用HTML5、CSS、JavaScript開發動態互動內容的設計工具。內容可以同時兼容移動設備和桌面電腦。Edge的一個重要功能是 Web工具包界面,方便確保頁面在不同瀏覽器中的架構一致性,此外Edge還將整合TypeKit這樣的字體服務。 動畫和圖形可以添 加到HTML元素中,程序也能通過Edge自身的代碼片段庫或者JavaScript代碼進行擴展。動畫可以在獨立的時間線上進行嵌套,還能實現互動功 能。符合可以服用並通過API和代碼片段控制。通過Edge設計的內容可以兼容iOS和Android設備,也可以運行在火狐、Chrome、 Safari和IE9等主流瀏覽器。 二、Adobe Dreamweaver CS6 Adobe Dreamweaver CS6作為一個Web設計軟體,提供了對HTML網站和移動程序的可視化編輯界面。其Fluid Grid排版系統整合CSS樣式表功能,提供自適應版面的跨平台兼容性。開發者可以完全實現Web設計的可視化操作,無需為代碼所困。 用戶不但還能在Live View中預覽,還提供多屏幕預覽功能。開發者可以通過MultiScreen預覽面板查看HTML5內容的渲染效果。Live View通過WebKit渲染引擎支持HTML5。 三、Adobe ColdFusion 10 ColdFusion是用來開發企業Web程序的伺服器端技術,通過Websockets、互動表單、視頻和地理標簽等HTML5技術創建富媒體用戶體驗。 四、Sencha Architect 2 在開發移動和桌面應用的工具中,Sencha的定位是HTML5可視化應用開發。開發團隊可以在一個單一集成的環境中完成應用的設計、開發和部署。開發者還可以開發Sencha Touch2和Ext JS4 JavaScript應用,並實時預覽。 五、Sencha Touch 2 Sencha Touch2是移動應用框架,也被看作是Sencha的HTML5平台。開發者可以用它開發面向iOS、Android和Blackberry、Kindle Fire等多種平台的移動應用。 六、Dojo Foundation Maqetta 來自於IBM的一個項目,Dojo Foundation Maqetta是為桌面和移動設備開發HTML5應用的開源工具,支持在瀏覽器中查看HTML5界面。用戶體驗設計師可以通過拖放組裝UI樣板 七、微軟Visual Studio 2010 ServicePack 1 雖然一開始並不支持HTML5,但微軟在2011年三月發布的Visual Studio 2010 SP1中提供了IntelliSense,追加了針對HTML5的一些元素。 八、JetBrains WebStorm 4.0 作為擁有HTML編輯器的JavaScript集成開發環境,WebStorm4.0提供了開發web應用的HTML5樣板。開發者可以在創建HTML文檔時可獲得對HTML5文件的支持。例如砍伐者鍵入。開發者還可以在chrome瀏覽器中實時預覽HTML文檔。 九、Google Web Toolkit 該開發工具用於開發瀏覽器應用,但庫中支持很多HTML5功能。包括對客戶端或web存儲的支持。其他HTML5功能還包括支持Canvas可視化,以及音頻和視頻widget。 十、DCloud HBuilder HBuilder是當前最快的HTML開發工具,強大的代碼助手幫你快速完成開發,最全的語法庫和瀏覽器兼容性數據讓瀏覽器碎片化不再頭痛。
5. Android開發中應該使用哪一種主流json框架
Gson、FastJson、Jackson每種都有自己的優劣勢。
Gson、FastJson、Jackson綜合對比
三種框架在實現上都使用了反射機制;
三種框架目前仍然在維護,所以從這一點來講,使用任何一個框架都是靠譜的,因為有人在維護,反饋問題可以改,遇到問題也可以問;
三種框架FastJson的包最小(為了方便對比大小,均是對jar包做的統計),只有196K,其次是Gson的227K,Jackson會大很多,超過了1M;
三種框架在1000倍數據量級以內效率都很高、佔用內存也低,效率最高的是FastJson,內存佔用都差不多;1000倍數據量級以上內存佔用會很大,並且平均耗時會超過1S,FastJson表現中規中矩;
json解析、轉換是一件很耗CPU的工作;
三種框架在bean轉換為json時都有很好的易用性,但在json解析的實現上,FastJson使用起來最簡單,其次是Gson;
FastJson對bean有要求,必須要有默認的構造函數,如果bean類沒有默認的構造函數並且是無法修改的(比如拿不到源碼),相比於另外兩個框架會有弱勢。