Kotlin Gson解析泛型对象

5,102 阅读1分钟

API:API说明文档:www.juhe.cn/docs/api/id…
接口地址:v.juhe.cn/wepiao/quer…
API返回的json:

{"reason":"请求成功","result":{"h5url":"http:\/\/v.juhe.cn\/wepiao\/go?key=xxxxxxxxx","h5weixin":"http:\/\/v.juhe.cn\/wepiao\/go?key=xxxxxxxxxx&s=weixin"},"error_code":0}
{
    "reason": "请求成功",
    "result": {
        "h5url": "http://v.juhe.cn/wepiao/go?key=xxxxxxxxxxxxx",
        "h5weixin": "http://v.juhe.cn/wepiao/go?key=xxxxxxxxxx&s=weixin"
    },
    "error_code": 0
}

实体类

  • H5TicketUrl
    data class H5TicketUrl(val h5url: String, val h5weixin: String)
  • H5TicketResult
    data class H5TicketResult(val error_code: Int, val reason: String, val result: H5TicketUrl)
  • ProjectBaseResult
    data class ProjectBaseResult<out M>(val reason: String, val error_code: Int, val result: M)

    请求

    val url = freeApi.reqUrl + "?key=" + APP_KEY // 请求url
    val resultJson = URL(url).readText()  // 发送请求,resultJson为返回的json

    解析Json-method 1

    val result = Gson().fromJson<H5TicketResult>(resultJson, H5TicketResult::class.java)

    解析Json-method 2

    val type = object : TypeToken<ProjectBaseResult<H5TicketUrl>>() {}.type
    val result = Gson().fromJson<ProjectBaseResult<H5TicketUrl>>(resultJson, type)

    解析Json-method 3

    val result = object : BaseResult<H5TicketUrl>() {}.fromJson(resultJson)
abstract class BaseResult<out M> : ParameterizedType {

    override fun getRawType(): Type {
        return ProjectBaseResult::class.java
    }

    override fun getOwnerType(): Type? {
        return null
    }

    override fun getActualTypeArguments(): Array<Type> {
        val superclass = this.javaClass.genericSuperclass
        if (superclass is Class<*>) {
            throw RuntimeException("Missing type parameter.")
        }
        return (superclass as ParameterizedType).actualTypeArguments
    }

    fun fromJson(json: String): ProjectBaseResult<M> {
        return Gson().fromJson<ProjectBaseResult<M>>(json, this)
    }

}