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


    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")}
    " +
                    "desc=${obj.getString("desc")}
    " +
                    "count=${obj.getInt("count")}
    "
            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}	item=${item.getString("item")}
    "
            }
            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)}
    "
            }
            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串内容如下:
    $json" }
            btn_convert_json.setOnClickListener {
                //利用Gson包直接将json串解析为对应格式的数据类对象
                val newUser = Gson().fromJson(json, UserInfo::class.java)
                tv_json.text = "从json串解析而来的用户信息如下:" +
                        "
    	姓名=${newUser.name}" +
                        "
    	年龄=${newUser.age}" +
                        "
    	身高=${newUser.height}" +
                        "
    	体重=${newUser.weight}" +
                        "
    	婚否=${newUser.married}"
            }
        }
    }
    

      

  • 相关阅读:
    Java代理模式
    PHP7.3.0+弃用FILTER_FLAG_SCHEME_REQUIRED的解决办法
    《PHP7底层设计与源码实现》学习笔记1——PHP7的新特性和源码结构
    《MySQL实战45讲》学习笔记2——MySQL的日志系统
    PHP反射学习总结
    依赖注入模式中,为什么用对象而不是用数组传递?
    记MySQL的一次查询经历
    数据结构与算法之PHP递归函数
    PHP的json_encode()函数与JSON对象
    Linux系统如何查看版本信息
  • 原文地址:https://www.cnblogs.com/aqi00/p/9901516.html
Copyright © 2020-2023  润新知