一、概述
kotlin 解析 json,直接调用 java的json库是没问题的,比如 Gson, fastjson。
但是比如 fatsjson 在解析 data 类时会报错:没有默认构造函数
//使用 compile 'com.alibaba:fastjson:1.1.68.android' 测试结果
com.alibaba.fastjson.JSONException: default constructor not found. class com.sungiven.merchant.data.httplayer.demo.A1
二、更kotlin的方式
1、Kotson ,基于Gson 的kotlin包装
2、jackson-module-kotlin,基于jackson的包装
3、Klaxon ,纯kotlin方案
4、Jkid
本文介绍下Kotson, 主要是前期android开发 一直也使用 Gson 这个库,虽然后偷懒使用fastjson(因为对后端返回的String串容错性更强,对于fastjson的容错有写一篇:Gson 与 fastJson 在使用上的差异(fastJson的优点))
三、kotson 使用
参考kotson 的github 链接:https://github.com/SalomonBrys/Kotson
特点
- 支持data 类的解析,不需要写默认值
- 泛型解析上很方便,不再需要指出对应的TypeToken,fastjson对应的是(TypeReference)。这个真心是方便了
- 读取 字段方便
demo
fun main(args: Array<String>) {
val jsonString = "{\"l1\":\"demo\",\"l2\":2}"
val jsonArrayString = "[{\"l1\":\"demo\",\"l2\":2},{\"l1\":\"demo\",\"l2\":2}]"
//使用fastjson 报错
try {
var a: A1 = JSONObject.parseObject(jsonString, A1::class.java)
} catch (e: Exception) {
println(e)
}
//使用java Gson的方式
try {
var s: A1 = Gson().fromJson(jsonString, A1::class.java)
println("s = $s")
} catch (e: Exception) {
println(e)
}
//使用 kotson 方式
try {
var s: A1 = Gson().fromJson(jsonString)
// var s = Gson().fromJson<A1>(jsonString)
var sarray = Gson().fromJson<List<A1>>(jsonArrayString)
//var sarray:List<A1> = Gson().fromJson(jsonArray)
println("s = $s sarray=$sarray")
} catch (e: Exception) {
println(e)
}
//读字段
var json:JsonElement = Gson().fromJson(jsonString)
println(json["l1"])
println(json["l2"])
var json2:JsonArray = Gson().fromJson(jsonArrayString)
println(json2[0])
println(json2[0]["l1"])
}
data class A1(
val l1: String? ,
val l2: Int?
)