欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Kotlin入门(31)JSON字符串的解析

程序员文章站 2022-06-16 22:01:34
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}"
        }
    }
}