Java數據解析之JSON

来源:https://www.cnblogs.com/WUXIAOCHANG/archive/2019/04/04/10657050.html
-Advertisement-
Play Games

文章大綱 一、JSON介紹二、常見框架介紹與實戰三、Studio中GsonFormat插件使用四、項目源碼下載(含參考資料)五、參考文檔 一、JSON介紹 1. 簡介 JSON 的全稱是 JavaScript Object Notation,是一種輕量級的數據交換格 式。 2. 特點 (1)JSON ...


文章大綱

一、JSON介紹
二、常見框架介紹與實戰
三、Studio中GsonFormat插件使用
四、項目源碼下載(含參考資料)
五、參考文檔

 

一、JSON介紹

1. 簡介

  JSON 的全稱是 JavaScript Object Notation,是一種輕量級的數據交換格 式。

2. 特點

(1)JSON 比 XML 數據傳輸的有效性要高出很多
(2)JSON 完全獨立於編程語言
(3)本質就是具有特定格式的字元串

3. JSON 數據格式

整體結構

String json1 = "{"id":12,"name":"Tom"}"
String json2 = "[{"id":12,"name":"Tom"},{"id":12,"name":"Tom"}]"

Json 數組
(1)Json 數組的結構: [value1, value2, value3]
(2)例子:
[1, “ab”,[], {“n”:123, “b”:”abc”}] 正確 [1, “a”:3] 錯誤

Json 對象
(1)Json 對象的結構: {key1:value1, key2:value2, key3:value3}
(2)key 的數據類型: 字元串
(3)value 的數據類型: 數值、字元串、null、json 數組 []、json 對象 {} (4)例子:
{“name”:”TOM”,“age”:12} 正確 {“aa”:“a”, 3} 錯誤

4. 原始的JSON解析實戰

將json格式的字元竄{}轉換為java對象

API:JsonObject
JSONObject(String json) : 將 json 字元串解析為 json 對象
Xxx getXxx(String name) : 根據 name, 在 json 對象中得到對應的 Value

private void jsonToJavaObjectByNative() {
        
        //獲取或者創建json數據
        String json = "{\n" +                
                        "\t\"id\":2, \"name\":\"大蝦\", \n" +                 
                         "\t\"price\":12.3, \n" +                 
                        "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" + 
                        "}\n";
        
        //解析json
        JSONObject jsonObject;
        
        //使用bean
        ShopInfo shopinfo = null;
        
        try {
            
            
            
            jsonObject = new JSONObject(json);
            
            int id = jsonObject.getInt("id");
            
            int id1 = jsonObject.optInt("id");//最好用opt方法,不會報異常
            
            String name = jsonObject.optString("name");//最好用opt方法,不會報異常
            
            double imagePath = jsonObject.optDouble("price");//最好用opt方法,不會報異常
            
            String price = jsonObject.optString("imagePath");//最好用opt方法,不會報異常
            
            shopinfo= new ShopInfo(id,name,imagePath,price);//把數據放進來
            
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

將json格式的字元竄{}轉換為java對象的list

API:JSONArray
JSONArray(String json) : 將 json 字元串解析為 json 數組
int length() : 得到 json 數組中元素的個數
Xxx getXxx(int index) : 根據下標得到 json 數組中對應的元素數據

private void jsonToJavaListByNative() {
        // TODO Auto-generated method stub
        
        //獲取或者創建json數據
        String json= "[\n" +
        "    {\n" +
        "        \"id\": 1,\n" +
        "        \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +             "        \"name\": \"大蝦 1\",\n" +             "        \"price\": 12.3\n" +
        "    },\n" +
        "    {\n" +
        "        \"id\": 2,\n" +
        "        \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
        "        \"name\": \"大蝦 2\",\n" +
        "        \"price\": 12.5\n" +
        "    }\n" +
        "]";
        
        //存放shopinfo集合
        List<ShopInfo> shops =new ArrayList<ShopInfo>();
        
        //解析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");//最好用opt方法,不會報異常
                    
                    double imagePath = jsonObject.optDouble("price");//最好用opt方法,不會報異常
                    
                    String price = jsonObject.optString("imagePath");//最好用opt方法,不會報異常
                    
                    //封裝java對象
                    ShopInfo shopinfo= new ShopInfo(id,name,imagePath,price);//把數據放進來
                
                    shops.add(shopinfo);
                }
                
            }
            
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

複雜json數據解析

/**
     * 複雜json數據解析
     * 
     * 就是第一層是大數據包括第二第三層的,第二層要從第一層里拿到一個key然後獲取下麵的數據,然後第三層又是從第二層里拿到一個key然後獲取裡面的數據

     * 
     * 一層一層的解析,從大到小
     */
    private void jsonToJavaOfComplex() {
        
        //獲取或者創建json數據
        String json ="{\n" +
                " \"data\": {\n" +
                " \"count\": 5,\n" +
                " \"items\": [\n" +
                " {\n" +
                " \"id\": 45,\n" +
                " \"title\": \" 堅果\"\n" +
                " },\n" +
                " {\n" +
                " \"id\": 132,\n" +
                " \"title\": \" 炒貨\"\n" +
                " },\n" +
                " {\n" +
                " \"id\": 166,\n" +
                " \"title\": \" 蜜餞\"\n" +
                " },\n" +
                " {\n" +
                " \"id\": 195,\n" +
                " \"title\": \" 果脯\"\n" +
                " },\n" +
                " {\n" +
                " \"id\": 196,\n" +
                " \"title\": \" 禮盒\"\n" +
                " }\n" +
                " ]\n" +
                " },\n" +
                " \"rs_code\": \"1000\",\n" +
                " \"rs_msg\": \"success\"\n" +
                "}";
        
        //封裝java對象
        DateInfo dateIndo = new DateInfo();
        
        JSONObject jsonObject;
        
        //解析json
        try {
            
            jsonObject = new JSONObject(json);
            
            //第一層解析一層一層解析
            JSONObject date = jsonObject.optJSONObject("data");//date是一個集合
            
            String rs_code = jsonObject.optString("rs_code");
            
            String rs_msg = jsonObject.optString("rs_msg");
            
            //第一層封裝  一層一層封裝
            dateIndo.setRs_code(rs_msg);
            
            dateIndo.setRs_msg(rs_msg);
            
            DateInfo.DataBean dateBean =new DateInfo.DataBean();//集合
            
            dateIndo.setData(dateBean);
        
            //第二層解析
            int count =date.optInt("count");
            
            JSONArray items = date.optJSONArray("items");
            
            //第二層數據封裝
            dateBean.setCount(count);//從集合裡面拿數據
            
            List<DateInfo.DataBean.ItemsBean> itemsBean = new ArrayList<DateInfo.DataBean.ItemsBean>();
            
            dateBean.setItems(itemsBean);
            
            //第三層解析
            for (int i = 0; i < items.length(); i++) {
                
                JSONObject jsonObject1= items.optJSONObject(i);
                
                if(jsonObject1 != null){
                    
                    int id = jsonObject1.optInt("id");
                    
                    String title = jsonObject1.optString("title");
                    
                    //第三層數據的封裝
                    DateInfo.DataBean.ItemsBean bean = new DateInfo.DataBean.ItemsBean();
                    
                    bean.setId(id);
                    
                    bean.setTitle(title);
                    
                    itemsBean.add(bean);
                    
                }
            }
            
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        //顯示json數據
        tv_native_orignal.setText(json);
        
        tv_native_last.setText(dateIndo.toString());
        
        
    }

二、常見框架介紹與實戰

1. GSON

簡介
  GSON是Google提供的用來在Java對象和JSON數據之間進行映射的Java類庫。可以將一個Json字元轉成一個Java對象,或者將一個Java轉化為Json字元串。

特點
(1)快速、高效
(2)代碼量少、簡潔
(3)面向對象
(4)數據傳遞和解析方便

代碼實戰

將 json 格式的字元串{}轉換為 Java 對象
(1)用到的 API
  <T> T fromJson(String json, Class<T> classOfT);//將 json 對象轉換為 Java 對象的方法
  註意:要求 json 對象中的 key 的名稱與 java 對象對應的類中的屬性名要相同
(2)使用步驟
  將 Gson 的 jar 包導入到項目中
  創建Gson對象 : Gson gson = new Gson(); (3)通過創建的Gson對象調用fromJson()方法,返回該JSON數據對應的Java對象

/**
     * //將json格式的字元竄{}轉換為java對象
     */
    private void jsonToJavaObjectByGson() {
        
        //1獲取或創建json數據
        String json ="{\n" +
        "\t\"id\":2, \"name\":\"大蝦\", \n" + 
        "\t\"price\":12.3, \n" +
        "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" + 
        "}\n";
        
        //2解析json數據
        Gson gson =new Gson();
        
        //第一個參數是要解析的數據,第二個參數是解析生成的java對象的類
        ShopInfo shopInfo =  gson.fromJson(json, ShopInfo.class);
        
    }

將json格式的字元竄{}轉換為java對象的list
(1)用到的 API
  T fromJson(String json, Type typeOfT);//將 json 數組轉換為 Java 對象的 list 註意:要求 json 對象中的 key 的名稱與 java 對象對應的類中的屬性名要相同
(2)使用步驟
  將 Gson 的 jar 包導入到項目中
  創建Gson對象 : Gson gson = new Gson(); (3)通過創建的Gson對象調用fromJson()方法,返回該JSON數據對應的Java集合: List<ShopInfo> shops = gson.fromJson(json, new
TypeToken<List<ShopInfo>>() {}.getType());

private void jsonToJavaListByGson() {
        
        //1獲取或創建json數據
         String json = "[\n" + 
        "    {\n" + 
                 "        \"id\": 1,\n" + 
        "        \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" + 
                 "        \"name\": \"大蝦 1\",\n" + 
        "        \"price\": 12.3\n" +             "    },\n" +             "    {\n" +  
                 "        \"id\": 2,\n" + 
        "        \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
        "        \"name\": \"大蝦 2\",\n" + 
        "        \"price\": 12.5\n" +             "    }\n" +
        "]";
         
        
        //2解析json數據
         Gson gson =new Gson();      
         
         //List<ShopInfo>:是要返回數據的集合
         List<ShopInfo> shops = gson.fromJson(json,new TypeToken<List<ShopInfo>>(){}.getType());
         
        
        //3顯示數據
         tv_gson_orignal.setText(json);
            
        tv_gson_last.setText(shops.toString());
        
    }

將java對象轉換為json字元竄
(1)用到的 API
  String toJson(Object src);
(2)使用步驟
  將 Gson 的 jar 包導入到項目中
  創建Gson對象 : Gson gson = new Gson(); (3)通過創建的Gson對象調用toJson()方法,返回json數據:
ShopInfo shop = new ShopInfo(1, "鮑魚", 250.0, ""); String json = gson.toJson(shop);

private void javaToJSONByGson() {
        
        //1獲取或創建java數據
        ShopInfo shopInfo = new ShopInfo(1,"鮑魚",250.0,"baoyu");
        
        
        //2生成json數據
        Gson gson = new Gson();
        
        String json = gson.toJson(shopInfo);
        
        //3顯示數據
         tv_gson_orignal.setText(shopInfo.toString());
            
            tv_gson_last.setText(json);
        
    }

將 Java 對象的 List 轉換為 json 字元串[]
(1)用到的 API
  String toJson(Object src);
(2)使用步驟
  將 Gson 的 jar 包導入到項目中
  創建Gson對象 : Gson gson = new Gson(); (3)通過創建的Gson對象調用toJson()方法,返回json數據:
List<ShopInfo> shops = new ArrayList<>(); String json = gson.toJson(shops);

/**
     * //將java對象的list轉換為json字元竄
     */
    private void javaToJSONArrayByGson() {
        
        //1獲取或創建java數據
        List<ShopInfo> shops =new ArrayList<ShopInfo>();
        
        ShopInfo baoyu = new ShopInfo(1,"鮑魚",250.0,"baoyu");
        
        ShopInfo longxia = new ShopInfo(1,"龍蝦",250.0,"longxia");
        
        shops.add(baoyu);
        
        shops.add(longxia);
        
        //2生成json數據
        Gson gson = new Gson();
        
        String json = gson.toJson(shops);
        
        
        //3顯示數據
         tv_gson_orignal.setText(shops.toString());
            
            tv_gson_last.setText(json);
    }

2. FastJson

簡介
  在日常的java項目開發中,JSON的使用越來越頻繁,對於Json的處理工具也有很多。接下來就介紹一下阿裡開源的一個高性能的JSON框架FastJson,功能完善,完全支持標準JSON庫,現在已經越來越受到開發者的青睞。

2. 特點
  Fastjson 是一個 Java 語言編寫的高性能功能完善的 JSON 庫。它採用一種“假定有序快速匹配”的演算法,把JSONParse的性能提升到極致,是目前Java語言中最快的JSON庫。

代碼實戰

將 json 格式的字元串{}轉換為 Java 對象
(1)用到的 API
  < T > T parseObject(String json, Class<T> classOfT); //將 json 對象轉換為 Java對象的方法
  註意:要求 json 對象中的 key 的名稱與 java 對象對應的類中的屬性名要相同
(2)使用步驟
  導入 fastjson 的 jar 包 (2)JSON調用parseObject()方法,獲取轉換後的Java對象

private void jsonToJavaObjectByFastJson() {

// 1 獲取或創建 JSON 數據
 String json = "{\n" +
"\t\"id\":2, \"name\":\"大蝦\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\ "\n" +
"}\n";

// 2 解析 JSON 數據
ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);

}

將 json 格式的字元串[]轉換為 Java 對象的 List
(1)用到的 API
  List<T> parseArray(String json,Class<T> classOfT);//將 json 數組轉換為 Java 對象的 list
  註意:要求 json 對象中的 key 的名稱與 java 對象對應的類中的屬性名要相同
(2)使用步驟
  導入 fastjson 的 jar 包 (2)JSON調用parseArray()方法,獲取轉換後的Java集合

private void jsonToJavaListByFastJson() {

// 1 獲取或創建 JSON 數據
 String json = "[\n" +
" {\n"+
" \"id\": 1,\n" +
" \"imagePath\":
\"http://192.168.10.165:8080/f1.jpg\",\n" +
" " " " " "
\"name\": \"大蝦 1\",\n" +
\"price\": 12.3\n" + },\n" +
{\n"+
\"id\": 2,\n" + \"imagePath\":
\"http://192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"大蝦 2\",\n" +
" \"price\": 12.5\n" + " }\n"+
"]";

// 2 解析 JSON 數據
List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);
}

將 Java 對象轉換為 json 字元串
(1)用到的 API
  String toJSONString(Object object);
(2)使用步驟
  導入 fastjson 的 jar 包
  JSON調用toJSONString()方法,獲取轉換後的json數據

private void javaToJsonObjectByFastJson() {
// 1 獲取 Java 對象
ShopInfo shopInfo = new ShopInfo(1, "鮑魚", 250.0, "baoyu");
// 2 生成 JSON 數據
String json = JSON.toJSONString(shopInfo);
// 3 數據顯示 tv_fastjson_orignal.setText(shopInfo.toString()); tv_fastjson_last.setText(json);
}

將 Java 對象的 List 轉換為 json 字元串[]
(1)用到的 API
  String toJSONString(Object object);
(2)使用步驟
  導入 fastjson 的 jar 包
  JSON調用toJSONString()方法,獲取轉換後的json數據

private void javaToJsonArrayByFastJson() {
// 1 獲取 Java 集合
List<ShopInfo> shops = new ArrayList<>();
ShopInfo baoyu = new ShopInfo(1, "鮑魚", 250.0, "baoyu");
ShopInfo longxia = new ShopInfo(2, "龍蝦", 251.0, "longxia"); shops.add(baoyu);
shops.add(longxia);
// 2 生成 JSON 數據
String json = JSON.toJSONString(shops);
// 3 數據顯示 tv_fastjson_orignal.setText(shops.toString()); tv_fastjson_last.setText(json);
}

三、Studio中GsonFormat插件使用

1. GsonFormat是什麼

  可根據xml內容快速生成bean類的插件

2. 使用方法

打開 Android studio 頁面,點擊設置按鈕

 

點擊 Plugins 按鈕

 

在右側輸入框中輸入 gsonformat,然後點擊中間部位的 Browse(必須在聯網情況下點擊)

 

選擇 GsonFormat,點擊右側的安裝插件

 

 

重啟一下 Android studio

在 Android studio 中創建一個類

 

在該類中同時按下 alt+shift+s,並點擊 GsonFormat

 

四、項目源碼下載(含參考資料)

鏈接:https://pan.baidu.com/s/1PEz1jMc6B2CvB8HQn6A-pg
密碼:rpjy

五、參考文檔

    1. http://www.atguigu.com
    2. https://www.cnblogs.com/1024zy/p/6370305.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹 本文介紹如何在 CentOS 7(6/6.5)、 Fedora、RHEL 上安裝 Java。Java是一個流行的軟體平臺,允許您運行Java應用程式。 本文涵蓋了以下Java版本的安裝: OpenJDK 8 Oracle Java 8 先決條件 在開始之前,您應該有一個能夠執行 root 許可權 ...
  • [Question]問題描述: 單獨的ListView列表能自動垂直滾動,但當將ListView嵌套在ScrollView後,會和ScrollView的滾動滑塊衝突,造成ListView滑塊顯示不完整。 ...
  • 恢復內容開始 運用jieba庫分詞 一、jieba庫基本介紹 1、jieba庫概述 jieba是優秀的中文分詞第三方庫 - 中文文本需要通過分詞獲得單個的詞語 - jieba是優秀的中文分詞第三方庫,需要額外安裝 - jieba庫提供三種分詞模式,最簡單隻需掌握一個函數 2、jieba分詞的原理 J ...
  • 1.概念 值傳遞:方法調用時,實際傳入的是它的副本,在方法中對值的修改,不影響調用者的值。 引用傳遞:方法調用時,實際傳入的是參數的實際記憶體地址,調用者和調用方法所操作的參數都指向同一記憶體地址,所以方法中操作會影響調用者。 2.問題 ① 值傳遞傳入的值,是它的副本是什麼意思? 列印結果: 0 此處調 ...
  • 死磕 java集合之TreeMap源碼分析(二) 紅黑樹插入元素的時間複雜度如何? 為什麼插入元素之後要做平衡? 以什麼樣的形式平衡最省時間? 如果插入元素的順序不一樣,會得到同樣的樹嗎? ...
  • 第三天學習內容 今日內容 1、整型(int) 2、布爾類型(bool) 3、字元串(str) 內容詳細 1、整型 Python中的整型用int表示。 1.python2中: 在32位機器上,整數的位數為32位,取值範圍為 2 31~2 31 1,即 2147483648~2147483647 在64 ...
  • 爬蟲常用庫urllib 註:運行環境為PyCharm urllib是Python3內置的HTTP請求庫 urllib.request:請求模塊 urllib.error:異常處理模塊 urllib.parse:url解析模塊 urllib.robotparse:robot.txt解析模塊 1、url ...
  • 1 package quicksort; 2 3 import org.junit.Test; 4 5 import java.util.Arrays; 6 7 public class QuickSort { 8 9 @Test 10 public void setUp() throws Exce... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...