Kotlin入門(31)JSON字元串的解析

来源:https://www.cnblogs.com/aqi00/archive/2018/11/03/9901516.html
-Advertisement-
Play Games

json是App進行網路通信最常見的數據交互格式,Android也自帶了json格式的處理工具包org.json,該工具包主要提供了JSONObject(json對象)與JSONArray(json數組)的解析處理。下麵分別介紹這兩個工具類的用法:1、JSONObjectJSONObject的常用方 ...


json是App進行網路通信最常見的數據交互格式,Android也自帶了json格式的處理工具包org.json,該工具包主要提供了JSONObject(json對象)與JSONArray(json數組)的解析處理。下麵分別介紹這兩個工具類的用法:
1、JSONObject
JSONObject的常用方法如下所示:
構造函數 : 從指定字元串構造出一個JSONObject對象。
getJSONObject : 獲取指定名稱的JSONObject對象。
getString : 獲取指定名稱的字元串。
getInt : 獲取指定名稱的整型數。
getDouble : 獲取指定名稱的雙精度數。
getBoolean : 獲取指定名稱的布爾數。
getJSONArray : 獲取指定名稱的JSONArray數組對象。
put : 添加一個JSONObject對象。
toString : 把當前JSONObject輸出為一個json字元串。
2、JSONArray
JSONArray的常用方法如下所示:
length : 獲取JSONArray數組對象的長度。
getJSONObject : 獲取JSONArray數組對象在指定位置處的JSONObject對象。
put : 往JSONArray數組對象中添加一個JSONObject對象。
使用JSONObject和JSONArray對json串進行手工解析,處理過程比較常規,完成該功能的Kotlin代碼與Java代碼大同小異。下麵直接給出Kotlin解析json串的常用代碼片段,包括如何構造json串、如何解析json串,以及如何遍歷json串:

    //構造json串
    private val jsonStr: String
        get() {
            val obj = JSONObject()
            obj.put("name", "地址信息")
            val array = JSONArray()
            for (i in 0..2) {
                val item = JSONObject()
                item.put("item", "第${i+1}個元素")
                array.put(item)
            }
            obj.put("list", array)
            obj.put("count", array.length())
            obj.put("desc", "這是測試串")
            return obj.toString()
        }

    //解析json串
    private fun parserJson(jsonStr: String?): String {
        val obj = JSONObject(jsonStr)
        var result = "name=${obj.getString("name")}\n" +
                "desc=${obj.getString("desc")}\n" +
                "count=${obj.getInt("count")}\n"
        val listArray = obj.getJSONArray("list")
        //util表示的範圍是左閉右開區間。以下語句相當於for (i in 0..listArray.length() - 1)
        for (i in 0 until listArray.length()) {
            val item = listArray.getJSONObject(i)
            result = "${result}\titem=${item.getString("item")}\n"
        }
        return result
    }

    //遍歷json串
    private fun traverseJson(jsonStr: String?): String {
        var result = ""
        val obj = JSONObject(jsonStr)
        val it = obj.keys()
        while (it.hasNext()) { // 遍歷JSONObject
            var key = it.next().toString()
            result = "${result}key=$key, value=${obj.getString(key)}\n"
        }
        return result
    }

前面提到Kotlin對json串的手工解析沒有什麼好辦法,其實是有更高層次的辦法。手工解析json串實在是麻煩,費時費力還容易犯錯,所以好漢不吃眼前虧,此路難走不如另尋捷徑,捷徑便是甩開手工解析幾條街的自動解析。

既然是自動解析,首先要制定一個規則,約定json串有哪些元素,具體對應怎樣的數據結構;其次還得有個自動解析的工具,俗話說得好,沒有金剛鑽、不攬瓷器活。對於捷徑第一要素的json數據結構定義,Kotlin特有的數據類正好派上用場了,欄位名、欄位類型、欄位預設值等色香味俱全,還有equals、copy、toString等下酒小菜,只要開發者輕拉珠簾便是一大桌的滿漢全席。到底有多麼省事,且看下麵的用戶信息數據類,包括姓名、年齡、身高體重、婚否等欄位存取在內的完整功能,僅需一行Kotlin代碼就全部搞定了:

data class UserInfo(var name: String="", var age: Int=0, var height: Long=0L, var weight: Float=0F, var married: Boolean=false)

 

接著解決捷徑第二要素的工具使用,json解析除了系統自帶的org.json,谷歌公司也提供了一個增強庫gson,專門用於json串的自動解析。不過由於是第三方庫,因此首先要修改模塊的build.gradle文件,在裡面的dependencies節點下添加下麵一行配置,表示導入指定版本的gson庫:

    compile "com.google.code.gson:gson:2.8.2"

 

其次還要在kt源碼文件頭部添加如下一行導入語句,表示後面會用到Gson工具類:

import com.google.gson.Gson

 

完成了以上兩個步驟,然後就能在代碼中調用Gson的各種處理方法了,Gson常用的方法有兩個,一個名叫toJson,可把數據對象轉換為json字元串;另一個名叫fromJson,可將json字元串自動解析為數據對象,方法調用的代碼格式為“fromJson(json串, 數據類的類名::class.java)”。Kotlin的數據類定義代碼尚且只有一行,這裡的json串自動解析仍舊只需一行代碼,實實在在為開發者節省了不少功夫。下麵是個通過gson庫實現json自動解析的Kotlin代碼例子:

class JsonConvertActivity : AppCompatActivity() {
    private val user = UserInfo(name="阿四", age=25, height=160L, weight=45.0f, married=false)
    private val json = Gson().toJson(user)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_json_convert)
        btn_origin_json.setOnClickListener { tv_json.text = "json串內容如下:\n$json" }
        btn_convert_json.setOnClickListener {
            //利用Gson包直接將json串解析為對應格式的數據類對象
            val newUser = Gson().fromJson(json, UserInfo::class.java)
            tv_json.text = "從json串解析而來的用戶信息如下:" +
                    "\n\t姓名=${newUser.name}" +
                    "\n\t年齡=${newUser.age}" +
                    "\n\t身高=${newUser.height}" +
                    "\n\t體重=${newUser.weight}" +
                    "\n\t婚否=${newUser.married}"
        }
    }
}

  


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

-Advertisement-
Play Games
更多相關文章
  • 1. 說明 本文檔針對docker swarm操作。 針對的系統是以一個本地的測試系統為例。其中機器信息如下,172.16.1.13作為docker swarm的管理機。 本地測試的機器列表信息: 主機名 模擬的外網 內網IP 要部署模塊 mini01 10.0.0.11 172.16.1.11 t ...
  • 新電腦安裝了Ubuntu 14.04,但是網路連接中只有乙太網而沒有WiFi的選項. 打開System Setting系統設置-Software&Updates軟體&更新-Additional Drivers附加驅動,無法載入出相應的驅動,更換為國內源也無法顯示出相應的驅動. 打開Terminal使 ...
  • 1.背景 互聯網從來就不是一個安全的地方。很多時候我們過分依賴防火牆來解決安全的問題,不幸的是,防火牆是假設“壞人”是來自外部的,而真正具有破壞性的攻擊事件都是往往都是來自於內部的。 近幾年,在thehackernews等網站上總會時不時看到可以看到一些因為數據安全問題被大面積攻擊、勒索的事件。在H ...
  • 原文地址:https://blog.csdn.net/u011583336/article/details/80999043 之前工作中用的資料庫多是ms sqlserver,偶爾用到mysql都是運維配置好 ,今天心血來潮,在本地電腦安裝了一個mysql8.**的版本。建好表測試的時候發現報錯。c ...
  • 實現python封裝# encoding=utf8import MySQLdb#定義類class MysqlHelper(): def __init__(self,host,port,db,user,passwd,charset='utf8'): self.host=host self.port=p... ...
  • python開發過程中用到資料庫無外乎MYSQL,Mangodb,redis三種,三者資料庫使用可能存在差異,但在一些基礎的語句使用時都是大同小異的,這階段學習了一些基礎操作,記錄下add:# -*- coding: utf-8 -*-import MySQLdbtry: conn=MySQLdb.... ...
  • 刪除存儲過程註意事項 在刪除任何存儲過程之前,請檢查依賴對象,並且相應地修改這些對象。 如果沒有更新這些對象,則刪除存儲過程可能會導致依賴對象和腳本失敗。 若要顯示現有過程的列表,請查詢 sys.objects 目錄視圖。 若要顯示過程定義,請查詢 sys.sql_modules 目錄視圖。 需要擁 ...
  • 前言: 本人是一個只有幾個月工作經驗的碼小渣。這是我寫的第一篇博客,如有不足之處還請大家不要介意,還請大佬可以指出問題。 在這幾個月的實戰開發中自己也遇到了很多問題,真的是舉步艱難啊!!! 在實戰開發中遇到最多的就是findViewById我相信這也是很多和我一樣初入安卓行業的碼小渣遇到的最多的代碼 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...