# Android筆記–使用GSON類別庫解析&生成JSON數據 相關閱讀: - [物件導向語言筆記--JSON](https://hackmd.io/@9YAtszqXS2OLNZOrLY_-Jg/OOP_JSON) - [Android筆記–使用JSON.org類別庫解析&生成JSON數據](https://hackmd.io/@9YAtszqXS2OLNZOrLY_-Jg/android_JSON_org) - [kotlin筆記–Data class](https://hackmd.io/@9YAtszqXS2OLNZOrLY_-Jg/kotlin_DataClass) - [Android筆記–kotlin Coroutines(kotlin 協程)](https://hackmd.io/@9YAtszqXS2OLNZOrLY_-Jg/kotlin_coroutines) --- GSON 是 Google 提供的一個用於處理 JSON 格式數據的 Java 库。它提供了一組強大而靈活的 API,用於將 Java 對象序列化為 JSON 字符串,或將 JSON 字符串反序列化為 Java 對象。GSON 目的是提供開發者==快速的將JSON字串(String)轉換成指定類型的物件(Object)==。 --- ## ▼事前準備 ### -1.JSON檔案 請到"[這裡](https://hackmd.io/bqsb35gFRGCLhYQZuZkM6Q#%E2%96%BCJSON%E7%AF%84%E4%BE%8B%E6%9C%89%E5%A4%A0%E9%95%B7%EF%BC%8C%E6%89%80%E4%BB%A5%E9%99%84%E4%B8%8A%E7%AF%84%E4%BE%8B%E5%BA%95%E9%83%A8%E7%9A%84%E5%82%B3%E9%80%81%E9%96%80)"拿取(或是自己生) ### -2.JSON_TO_Kotlin_Class小工具(非必要) :::info :::spoiler ※===JSON_TO_Kotlin_Class小工具===※ 1.在settingplugins中搜尋JSON TO Kotlin Class下載並安裝,然後重啟AndroidStudio 2.使用快捷鍵`Alt + K`可以呼叫工具視窗,在視窗中貼上JSON檔案後輸入Class Name就可以生成我們所需要的JSON檔案的格式(Data class)了 :::success - :::spoiler ※===圖片解說===※   :::danger - :::spoiler ※===進階設置===※ - 在工具視窗的左下角有一個`Advance`,按下後可以開啟進階設置視窗 -  -  -  ::: ### -3.啟用GSON: 1.到[GSON的GitHub官網](https://github.com/google/gson)獲得插件位置 2.到build.gradle.kts(Module:app)將位址載入 ``` dependencies { implementation ("com.google.code.gson:gson:2.10.1") } ``` 備註:注意位址的格式  --- ## ▼用法: #### 1.在使用了["JSON TO Kotlin Class小工具"](#-2.JSON_TO_Kotlin_Class小工具(非必要))之後,會生成Class套Class這種俄羅斯套娃式的檔案  #### 2.因此,我們要取得內容的話只需要像我們平常調用Class中的屬性時即可,如下圖,JSON的第一層對應我們的第一層Class  --- ## ▼範例: #### 例如說要取得"ReportContent"字串的話,就要從MyEvent Class的物件一層一層的載入   ## ▼Gson的常用方法: - **Gson().toJson()**: 將 Java 對象序列化為 JSON 字符串的方法。它接受一個 Java 對象作為參數,並返回將該對象轉換為 JSON 格式的字符串。 - **Gson().fromJson()**:將 JSON 字符串反序列化為 Java 對象的方法。==它接受兩個參數:一個包含 JSON 數據的字符串和一個目標 Java 對象的類型==。該方法將 JSON 字符串轉換為指定類型的 Java 對象。 - 基本的作用類似於 JSONObject().getJSONObject(),它們都用於將 JSON 數據轉換為對應的 Java 對象。 - Gson 需要知道要將 JSON 資料轉換成哪種類型的 Java 物件。 ===這個 Class 參數告訴 Gson 應該建立哪種類型的物件來儲存 JSON 資料並且根據 JSON 中的欄位名稱和物件的屬性名稱進行匹配==。 - **@SerializedName**:是 Google Gson 庫中的一個註解,用於指定 JSON 欄位的名稱與 Java 類別中欄位或方法的對應關係。 :::success - :::spoiler ※===@SerializedName詳細解說===※ - 通常情況下,JSON 欄位的名稱與 Java 物件的欄位或方法名稱需要一致才能正確對應(不一致會回傳null)。 但有時候,JSON 資料的欄位名稱可能與 Java 物件的欄位名稱不一致,這時候就可以使用 @SerializedName 註解來指定它們之間的對應關係。 - 這個對應關係,不管是在JAVA對象轉成JSON數據時或是JSON數據轉成JAVA對象時都有用(白話:@SerializedName在轉換時會自動幫你改成對應的名子)。 :::info ``` ///JSON文件 { "first_name": "John", "last_name": "Doe" } ///此處使用的是"first_name"和"last_name" ``` ``` import com.google.gson.annotations.SerializedName class Person { @SerializedName("first_name") var firstName: String? = null @SerializedName("last_name") var lastName: String? = null ///使用@SerializedName註解來使"first_name"和"firstName"關聯,"last_name"和"lastName"關聯 // Getters and setters... } ``` ::: :::warning **備註:** 當我們使用JSON.org 時,如果我們不多加 has 或 isNull 來判斷欄位資料是否存在,會直接噴出例外錯誤。但是如果是 GSON,並不會噴出錯誤,相對的,GSON會給不存在的資料一個null值。 ::: --- 踩坑紀錄1: --- 簡述:在JSON資料經過GSON處理之後,原本的空值全部都被改成null了,該怎麼樣才能保持空值? - 解答: - [Kotlin下的Gson解析Json数据](https://wangyeming.github.io/2019/11/12/kotlin-gson/) - [Gson 反序列化 Kotlin 数据类默认值失效](https://extremej.itscoder.com/gson_kotlin_data_class/) --- # GitHub專案:[MyPratice_GSON_1](https://github.com/PudCheetah/MyPratice_GSON_1) --- ▼參考資料: --- - [超簡單 Gson 使用法](https://ithelp.ithome.com.tw/articles/10227316) - [Day 10:Gson 資料解析](https://ithelp.ithome.com.tw/articles/10262049) - [Gson 泛型處理方式](https://medium.com/%E7%A8%8B%E5%BC%8F%E8%A3%A1%E6%9C%89%E8%9F%B2/gson-%E6%B3%9B%E5%9E%8B%E8%99%95%E7%90%86%E6%96%B9%E5%BC%8F-44254d6718c6) - [Gson:Google开源的JSON解析库(JAVA)](https://javabetter.cn/gongju/gson.html#_04%E3%80%81%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97) - ==★==[Android中轉換JSON的工具-GSON](https://jimmy4302001.medium.com/android%E4%B8%AD%E8%BD%89%E6%8F%9Bjson%E7%9A%84%E5%B7%A5%E5%85%B7-gson-3da217b58104) - [碼農日常-『Android studio』如何使用Gson製作Json格式資料](https://thumbb13555.pixnet.net/blog/post/323962924-json-maker) - [碼農日常-『Java&Kotlin』使用Gson解析JSON字串](https://thumbb13555.pixnet.net/blog/post/328611247-gsonconvert) - [碼農日常-『Android studio』取得網路資料(JSON格式)並以RecyclerView顯示列表](https://thumbb13555.pixnet.net/blog/post/314662580) - [Google 工具类 Gson 的基本使用”JAVA)](https://jueee.github.io/2020/10/2020-10-26-Google%E5%B7%A5%E5%85%B7%E7%B1%BBGson%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/) - [如何使用Gson(kotlin)](https://givemepass.blogspot.com/2014/10/gson.html) - [【Android】Gson 使用介紹](https://anson-site.blogspot.com/2016/01/androidgson.html) - [JAVA 3-3 GSON](https://rx1226.pixnet.net/blog/post/300642542) - [Kotlin下的Gson解析Json数据](https://wangyeming.github.io/2019/11/12/kotlin-gson/) - [Gson 反序列化 Kotlin 数据类默认值失效](https://extremej.itscoder.com/gson_kotlin_data_class/) - ==★==[[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换](https://blog.csdn.net/weixin_63357306/article/details/128441246)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up