Kotlin (四) JSON解析(Klaxon 解析 data, json泛型)

一、概述

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的优点)

三、Klaxon 使用

参考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?
)

猜你喜欢

转载自blog.csdn.net/lckj686/article/details/80612289