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
1、Kotson ,基于Gson 的kotlin包装
2、jackson-module-kotlin,基于jackson的包装
3、Klaxon ,纯kotlin方案
4、Jkid
本文介绍下Kotson, 主要是前期android开发 一直也使用 Gson 这个库,虽然后偷懒使用fastjson(因为对后端返回的String串容错性更强,对于fastjson的容错有写一篇:Gson 与 fastJson 在使用上的差异(fastJson的优点))
参考klaxon 的github 链接:https://github.com/cbeust/klaxon
- 支持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? )