Android專案之JSON解析(3種解析技術詳解)
前言:
在我寫部落格前再宣告一下,我希望轉載我文章的某某某記得註明:(),要尊重我的勞動成果,這樣才能給我更多的支援和鼓勵!差不多有3天沒有寫部落格了,要想的、要做的事情太多了,額....原歸正傳,今天接著上一篇部落格:Android專案之JSON解析(扯淡),繼續分享我對JSON解析的瞭解。
一、用Android原生技術解析JSON:
特點:很麻煩,對於複雜的json資料解析很容易出錯!(不推薦使用)
1、解析JSON物件的API:JsonObject
JSONObject(String json);將Json字串解析成Json物件;
XxxgetXxx(String name) ;根據name在json物件中得到相應的value。
示例程式碼:
(1)獲取或建立JSON資料(為了方便,這裡就直接建立了):
String json = "{\n" + "\t\"id\":2, \"name\":\"金魚\", \n" + "\t\"price\":12.3, \n" + "\t\"imagePath\":\"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg\"\n" + "}\n"; ShopInfo shopInfo = null;
(2)解析Json物件:
try { JSONObject jsonObject = new JSONObject(json); // int id = jsonObject.getInt("id"); int id1 = jsonObject.optInt("id"); String name = jsonObject.optString("name"); double price = jsonObject.optDouble("price"); String imagePath = jsonObject.optString("imagePath"); // 封裝Java物件 shopInfo = new ShopInfo(id1, name, price, imagePath); } catch (JSONException e) { e.printStackTrace(); }
注意:這裡記得要加try_catch異常處理。
(3)建立JavaBean類,並顯示解析後的資料:
tv_native_last.setText(shopInfo.toString());
2、解析Json陣列的API:JSONArray
JSONArray(String json);將json字串解析成json陣列;
int length();得到json陣列中元素的個數;
XxxgetXxx(int s) ;根據下標得到json陣列中對應的元素資料。
示例程式碼:
(1)獲取或建立JSON資料:
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://blog.csdn.net/qq_29269233/f1.jpg\",\n" +
" \"name\": \"金魚1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://blog.csdn.net/qq_29269233/f2.jpg\",\n" +
" \"name\": \"金魚2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
(2)解析json陣列:
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (jsonObject != null) {
int id = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
// 封裝Java物件
ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);
shops.add(shopInfo);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
(3)顯示解析後的資料:
tv_native_last.setText(shops.toString());
到此為止,這就是用原生的技術去解析json了,至於複雜特殊的json資料怎樣去解析,也是大同小異了,一層一層解析就對了!
二、用Gson框架技術解析JSON:
特點:解析沒那麼麻煩,程式碼量簡潔,可以很方便地解析複雜的Json資料,而且谷歌官方也推薦使用。
如過用Android Studio做開發的話,可以通過Gradle,直接新增依賴,不用下載jar包,很方便,如下:
1、用Gson解析JSON物件:
(1)將gson的jar包匯入到專案libs目錄下,或者直接通過Gradle新增依賴:
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
(2)建立Gson物件:
Gson gson = new Gson();
(3)通過建立的Gson物件呼叫fromJson()方法,返回該json資料物件的Java物件;
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
注意要記得建立物件的JavaBean類;要求json物件中的key的名稱與Java物件的JavaBean類中的屬性名要相同,否則解析不成功!
示例程式碼如下:
// 1 獲取或建立JSON資料
String json = "{\n" +
"\t\"id\":2, \"name\":\"金魚\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg\"\n" +
"}\n";
// 2 解析JSON資料
Gson gson = new Gson();
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
// 3 展示資料
tv_gson_last.setText(shopInfo.toString());
2、用Gson解析JSON陣列:
(1)(2)與上面相同,要用Gson就要先新增依賴,然後建立Gson物件;
(3)通過建立的Gson物件呼叫fromJson()方法,返回該json資料對應的Java集合。
這裡但強調一下:要記得建立物件的JavaBean類;要求json物件中的key的名稱與Java物件的JavaBean類中的屬性名要相同,否則解析不成功!
示例程式碼如下:
// 1 獲取或建立JSON資料
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://blog.csdn.net/qq_29269233/f1.jpg\",\n" +
" \"name\": \"金魚1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://blog.csdn.net/qq_29269233/f2.jpg\",\n" +
" \"name\": \"金魚2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
// 2 解析JSON資料
Gson gson = new Gson();
List<ShopInfo> shops = gson.fromJson(json, new TypeToken<List<ShopInfo>>() {
}.getType());
// 3 展示資料
tv_gson_last.setText(shops.toString());
還是那句話,複雜特殊的都是大同小異,理解了方法就沒問題了!
3、Gson還可以將Java物件、Java物件的List 轉換為json字串{};有興趣的就去研究一下哈。
三、用Fastjson框架技術解析JSON:
特點:Fastjson是用Java語言編寫的高效能功能完善的JSON庫。它採用了一種“假定有序、快速匹配”的演算法,
把JSON Parse的效能提升到極致,是目前Java語言中最快的JSON庫。
在github上,我還專門留意了這個,哈哈,gson和fastjson比起來,gson就是“烏龜”
要使用Fastjson,也是想Gson一樣,先匯入jar包,或者在Gradle中新增依賴:
compile 'com.alibaba:fastjson:1.1.55.android'
新增好依賴後就可以使用Fastjson了!
1、用Fastjson解析JSON物件:
利用Fastjson的JSON呼叫parseObject()方法,獲取轉換後的Java物件。
注意要記得建立物件的JavaBean類;要求json物件中的key的名稱與Java物件的JavaBean類中的屬性名要相同,否則解析不成功!
示例程式碼:
// 1 獲取或建立json資料
String json = "{\n" +
"\t\"id\":2, \"name\":\"金魚\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://blog.csdn.net/qq_29269233/L05_Server/images/f1.jpg\"\n" +
"}\n";
// 2 解析JSON資料
ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);
// 3 顯示資料
tv_fastjson_last.setText(shopInfo.toString());
2.用Fastjson解析JSON陣列:
利用Fastjson的JSON呼叫parseArray()方法,獲取轉換後的Java集合。
這裡但強調一下:要記得建立物件的JavaBean類;要求json物件中的key的名稱與Java物件的JavaBean類中的屬性名要相同,否則解析不成功!
示例程式碼:
// 1 獲取或建立json資料
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://blog.csdn.net/qq_29269233/f1.jpg\",\n" +
" \"name\": \"金魚1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://blog.csdn.net/qq_29269233/f2.jpg\",\n" +
" \"name\": \"金魚2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
// 2 解析JSON資料
List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);
// 3 顯示資料
tv_fastjson_last.setText(shopInfos.toString());
3、同樣Fastjson也可以將Java物件、Java物件的List 轉換為json字串{};有興趣的就去研究一下哈。
到此為止,已經完美對接了上一篇部落格:Android專案之JSON解析(扯淡) ,算是比較詳細地介紹了json解析了。
支援我的話可以關注下我的公眾號,也歡迎大家投稿~
掃一掃關注我的微信公眾號:程式猿在廣東
,
相關推薦
Android專案之JSON解析(3種解析技術詳解)
前言: 在我寫部落格前再宣告一下,我希望轉載我文章的某某某記得註明:(),要尊重我的勞動成果,這樣才能給我更多的支援和鼓勵!差不多有3天沒有寫部落格了,要想的、要做的事情太多了,額....原歸正傳,今天接著上一篇部落格:Android專案之JSON解析(扯淡),繼續分享我對
Socket程式設計之TCP例項(附C/C++程式碼詳解)
說明: 主要分步驟給出Windows平臺下socket程式設計的一個TCP例項;使用WINDOWS下網路程式設計規範Winsock完成網路通訊; 對程式各部分細節進行描述。 套接字有三種傳輸型別SOCK_STREAM SOCK_DGRAM SOCK_RAW;
hdoj6129 Just do it(三種方法加詳解)
題目連結 方法一:正解,本質是dp,採用二進位制優化,實現過程很巧妙(感謝Brassica) dp[i][j]表示第i次操作後第j項的取值,根據題意可得: dp[i][j]=dp[i][j−1]∧
Python:pygame遊戲程式設計之旅五(遊戲介面文書處理詳解)
再簡單的遊戲介面中均涉及文書處理,本節主要解讀一下pygame模組中對文字及字型的處理方式。 同樣,以例項進行講解,先看看程式碼: #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import
猴子選大王(3種超簡單的方法)
17個猴子圍成一圈,從某個開始報數1-2-3-1-2-3-……報“3”的猴子就被淘汰,遊戲一直進行到圈內只剩一隻猴子它就是猴大王了。 方法一: 小技巧:用陣列來記錄猴子是否在圈內的狀態:在圈內記為“
Java設計模式之五大創建型模式(附實例和詳解)
caf aac concrete 為什麽 ota pil sem 而不是 rtm 一、概況 總體來說設計模式分為三大類: (1)創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 (2)結構型模式,共七種:適配器模式、裝飾器模式、代理模式
Redis 設計與實現之RDB 和 AOF 兩種持久化模式詳解
在執行情況下, Redis 以資料結構的形式將資料維持在記憶體中, 為了讓這些資料在 Redis 重啟之後仍然可用, Redis 分別提供了 RDB 和 AOF 兩種持久化模式。 在 Redis 執行時, RDB 程式將當前記憶體中的資料庫快照儲存到磁碟檔案中, 在 Red
cocos2dx學習之路----第十章(Node節點生命週期詳解)
這一篇我們就來看看Node節點的生命週期問題。 對於Node節點的生命週期,也稱回撥事件的回撥。當對節點進行操作時,比如被新增或者移除,它預設都會呼叫自己的一些事件方法。現在就讓我們看看屬於它事件的回撥方法有哪些,如下所示: virtual void onEnter();
Android專案中各個資料夾的含義和用途詳解
1.src:存放所有的*.java源程式。 2.gen:為ADT外掛自動生成的程式碼檔案儲存路徑,裡面的R.java將儲存所有的資源ID。 3.assets:可以存放專案一些較大的資原始檔,例如:
購物車3種實現方式 詳解
購物車相當於現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。使用者可以在購物網站的不同頁面之間跳轉,以選購自己喜愛的商品,點選購買時,該商品就自動儲存到你的購物車中,重複選購後,最後將選中的所有商品放在購物車中統一到付款臺結賬,這也是儘量讓客戶體驗到現實生活中購
Servlet2.5和 3.0區別(Servlet 3.0 新特性詳解)
Servlet 3.0 新特性概述 Servlet 3.0 作為 Java EE 6 規範體系中一員,隨著 Java EE 6 規範一起釋出。該版本在前一版本(Servlet 2.5)的基礎上提供了若干新特性用於簡化 Web 應用的開發和部署。其中有幾項特性的引
java this 3種常見用法 詳解
1.區分成員變數和區域性變數 public class ThisDemo { public static void main(String[] args) { Student s=new Student("小明明
自定義一個更好用的SwipeRefreshLayout(彈力拉伸效果詳解)(轉載)
dsc drag 常數 lane swipe loading 數據改變 高中數學 tca 轉自: 自定義一個更好用的SwipeRefreshLayout(彈力拉伸效果詳解) 前言 熟悉SwipeRefreshLayout的同學一定知道,SwipeRefreshLayout是
CentOS6.5下Cloudera安裝搭建部署大數據集群(圖文分五大步詳解)(博主強烈推薦)
centos6 數據 http 時間 log .com pos OS 客戶端 第一步: Cloudera Manager安裝之Cloudera Manager安裝前準備(CentOS6.5)(一) 第二步: Cloudera Manager安裝之時間服務器和
函數的特點,應用,重載等講解(代碼加理論詳解)!
學生 打印 ext 錯誤 如果 ron sta urn double 函數的特點:1、定義函數可以將功能代碼進行封裝2、便於對該功能進行復用3、函數只有被調用才會被執行4、函數的出現提高了代碼的復用性5、對於函數沒有具體返回值的情況,返回值類型用關鍵字void表示,那麽該函
SELECT is not allowed in cluster (Redis叢集JedisCluster資料庫詳解)
(1)redis在單機模式下redis.conf配置檔案中預設的資料庫數量是16個, # Set the number of databases. The default database is DB 0, you can select# a different one on
Linux(vi/vim命令使用詳解)
vi test.txt 或者 vim test.txt 再或者 touch test.txt vim是vi的升級版,指令更多,功能更強。 下面是收集的vim用法,當在vim裡面要實現退出,首先要做的是按【Esc】,然後再輸入【:wq】 一、一般模式:
LNMP架構四(php-fpm的配置詳解)
四、php-fpm的配置詳解 和LAMP不同的是,在LNMP架構中,php-fpm作為獨立的一個服務存在,既然是獨立服務,那麼它必然有自己的配置檔案。php-fpm的配置檔案為/usr/local/php-fpm/etc/php-fpm.conf,它同
基於DNS解析的GSLB《CDN技術詳解》
基於DNS解析的GSLB工作方式 基於DNS解析的GSLB方案實際上就是把負載均衡裝置部署在DNS系統中。在使用者發出任何應用連線請求時,首先必須通過DNS系統來請求獲得伺服器的IP地址,基於DNS的GSLB正是在返回DNS解析結果的過程中進行智慧決策,給使用者
類和物件-中(6個預設函式詳解)
本文主要是對類的6個預設函式進行講解 類的預設成員函式有6個:建構函式 解構函式