1. 程式人生 > >Android專案之JSON解析(3種解析技術詳解)

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

Linuxvi/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個:建構函式                                                解構函式