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", "这是测试串")
String()
}
//解析json串
private fun parserJson(jsonStr: String?): String {
val obj = JSONObject(jsonStr)
var result = "name=${String("name")}\n" +
"desc=${String("desc")}\n" +
"count=${Int("count")}\n"
val listArray = JSONArray("list")
/
/util表⽰的范围是左闭右开区间。以下语句相当于for (i in 0..listArray.length() - 1)
for (i in 0 until listArray.length()) {
val item = JSONObject(i)
result = "${result}\titem=${String("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=${String(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串的⾃动解析。不过由于是第三⽅库,因此⾸先要修改模块的adle⽂件,在⾥⾯的dependencies节点下添加下⾯⼀⾏配置,表⽰导⼊指定版本的gson库:
compile "de.gson:gson:2.8.2"
其次还要在kt源码⽂件头部添加如下⼀⾏导⼊语句,表⽰后⾯会⽤到Gson⼯具类:
字符串转数组工具le.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?) {
setContentView(R.layout.activity_json_convert)
btn_origin_json.setOnClickListener { = "json串内容如下:\n$json" }
btn_convert_json.setOnClickListener {
//利⽤Gson包直接将json串解析为对应格式的数据类对象
val newUser = Gson().fromJson(json, UserInfo::class.java)
= "从json串解析⽽来的⽤户信息如下:" +
"\n\t姓名=${newUser.name}" +
"\n\t年龄=${newUser.age}" +
"\n\t⾝⾼=${newUser.height}" +
"\n\t体重=${newUser.weight}" +
"\n\t婚否=${newUser.married}"
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论