【问题标题】:Parsing JsonObject into kotlin Data class将 JsonObject 解析成 kotlin 数据类
【发布时间】:2019-05-24 13:01:02
【问题描述】:

我对@9​​87654321@ 还很陌生,我正在尝试将从HTTPRequest 获得的JsonObject 解析为data class。但我无法从 data 类中获得 Instance。

val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
    Response.Listener { response ->
        val text = "Response: %s".format(response.toString())
        print(text)
    },
    Response.ErrorListener { error ->
        // TODO: Handle error
    }

)

@Throws(AuthFailureError::class)
@Override
fun getHeaders(): Map<String, String> {
    var params = HashMap<String, String>()
    if (params == null) params = HashMap()
    val basicAuth = "Basic " + Base64.encodeToString("username:password".toByteArray(), Base64.NO_WRAP);
    params["Authorization"] = basicAuth
    //..add other headers
    return params
}

TempJsonObject.instance?.addToRequestQueue(jsonObjectRequest)

数据类

data class TempJsonObject(
    val content: List<Content>) {
data class Content(
        val kioskId: Int,
        val location: Location,
        val stats: Stats,
        val settings: Settings,
        val modules: String,
        val visibility: String
) {
    data class Stats(
            val allLockers: Int,
            val emptyLockers: Int,
            val malfunctionLockers: Int,
            val forCustomer: Int,
            val forCourier: Int,
            val bySize: BySize,
            val incoming: Any
    ) {
        data class BySize(
                val XXSMALL: Xxsmall,
                val XSMALL: Xsmall,
                val SMALL: Small,
                val MEDIUM: Medium,
                val LARGE: Large,
                val XLARGE: Xlarge
        ) {
            data class Xxsmall(
                    val empty: Int,
                    val hasContent: Int
            )
        ...

我尝试做的方式是正确的方法吗?我做错了什么?

【问题讨论】:

  • 好吧,对不起,以后不用了。
  • 你能在你实际解析 JSON 的地方粘贴一段吗?我不太明白instance? 的意思。还请写下运行代码时会发生什么。
  • @PiotrK 抱歉回答太长,工作日无法访问计算机,但更新了代码。由于出现以下错误,我也无法运行代码:“未解析的引用:实例”

标签: android json kotlin android-volley data-class


【解决方案1】:

看着instance?.addToRequestQueue,真是让我百思不得其解。我不知道任何像这样用于解析 JSON 的 Kotlin API。我以为您使用了一些添加此类 API 的库,但您还在评论中写道,由于缺少 instance 字段,代码无法编译。看起来它公开了数据类的一些单例实例。您能否指出使用此类 API 或您使用的任何其他来源的任何工作示例?

如果上面的结果不正确,我会使用一些 Kotlin 或 Java 库将 JSON 解析为数据类的 instance。一种选择是 Kotlin 库 Klaxon:https://github.com/cbeust/klaxon。引用一个适合您的用例的示例:

val result = Klaxon().parse<Person>(""" { "name": "John Smith", } """)

assert(result?.name == "John Smith")
assert(result.age == 23)

【讨论】:

  • 我正在使用Volley,可以在此处找到示例https://android--code.blogspot.com/2019/02/android-kotlin-volley-post-request-with.html。最后我放弃了使用Volley,并在使用OkHttp时使用return Gson().fromJson(JSONObject(response).toString(), TempJsonObject::class.java)这一行
猜你喜欢
  • 2014-08-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多