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}"
}
}
}

  

Kotlin入门(31)JSON字符串的解析的更多相关文章

  1. 动态Json字符串的解析

    动态Json字符串的解析 对于传统的Json字符串,比如有规定属性的对象,通常都会采用反序列化的方式就可以了,例如下面的方式: DataContractJsonSerializer ser = new ...

  2. JSON字符串——后台解析系列

    以前我们都是讲JSON字符串获取后,在前台进行展示.今天小编就交给大家后台解析展示数据的方法.非常方便,就以下代码: JObject obj = JObject.Parse(data); string ...

  3. HttpClient 模拟发送Post和Get请求 并用fastjson对返回json字符串数据解析,和HttpClient一些参数方法的deprecated(弃用)的综合总结

    最近在做一个接口调用的时候用到Apache的httpclient时候,发现引入最新版本4.5,DefaultHttpClient等老版本常用的类已经过时了,不推荐使用了:去官网看了一下在4.3之后就抛 ...

  4. jquery对JSON字符串的解析--eval函数

    jquery eval解析JSON中的注意点介绍----https://www.jb51.net/article/40842.htm

  5. js fs read json 文件json字符串无法解析

    读取 xxx.txt(里面就是一段 json)-> JSON.parse( fs.readFileSync( xxx.txt ) ) -> 报 SyntaxError: unexpecte ...

  6. Asp.Net对Json字符串的解析和应用

    using System.Web.Script.Serialization; protected void Page_Load(object sender,EventArgs e) { //构建jso ...

  7. Python编程 - json字符串的解析

    import json jsonString = '{"arrayOfNums":[{"number":0},{"number":1},{& ...

  8. Kotlin入门教程——目录索引

    Kotlin是谷歌官方认可的Android开发语言,Android Studio从3.0版本开始就内置了Kotlin,所以未来在App开发中Kotlin取代Java是大势所趋,就像当初Android ...

  9. Qt平台下使用QJson解析和构建JSON字符串

    前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣 ...

随机推荐

  1. ansible基础-加密

    一 简介 注:本文demo使用ansible2.7稳定版 众所周知,ansible是很火的一个自动化部署工具,在ansible控制节点内,存放着当前环境服务的所有服务的配置信息,其中自然也包括一些敏感 ...

  2. Kali学习笔记42:SQL手工注入(4)

    前三篇文章都是在讲发现SQL注入漏洞 如何查询得到所有的信息 那么另一条思路还未尝试过:能否修改数据? 例如这样: '; update users set user='yiqing' where us ...

  3. [Swift]LeetCode764. 最大加号标志 | Largest Plus Sign

    In a 2D grid from (0, 0) to (N-1, N-1), every cell contains a 1, except those cells in the given lis ...

  4. Docker系列教程01-Centos7安装新版Docker教程(10步)

    最近一直忙于开发,没有时间好好总结一下docker的知识.其实现在docker的教程已经很多很多了,但是很多系统的教程都是基于Ubuntu系统,因为官方推荐使用Ubuntu系统啊,原因在于Ubuntu ...

  5. Python高级特性(一)

    一.切片 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]Pyt ...

  6. 使用ML.NET和Azure Function进行机器学习 - 第2部分

    本文是<使用ML.NET和AzureFunction进行机器学习 - 第1部分>的续篇. 像机器一样识别鸢尾花 回顾第1部分,您将使用Visual Studio创建一个新的Azure Fu ...

  7. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  8. PerformanceCounter蛋痛的设计

    在.NET下对进程的性能计数可以使用PerformanceCounter,通过该对象可以对进程的CPU,内存等信息进行统计.对于正常使用来说这个对象还是很方便,但对于同一名称的多个进程进行性能计数那真 ...

  9. ASP.NET Core框架揭秘(持续更新中…)

    之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...

  10. man帮助文档打印

    这里不讨论大家都知道的man重定向的一般常用方法(col处理方法)$ man find | col -b > man_fine.txt [跟着我的思路走]假如您像我一样,直接使用如下命令导出fi ...