代码之家  ›  专栏  ›  技术社区  ›  CoolMind

如何在Kotlin中创建正确的JSON类(对于fuel)

  •  0
  • CoolMind  · 技术社区  · 6 年前

    我有一个返回json的请求:

    {
      "success": 0,
      "errors": {
        "phone": [
          "Incorrect phone number"
        ]
      }
    }
    

    我塞住了燃料,而不是改装科特林。所以,我的课程是:

    data class RegistrationResponse(
        val success: Int,
        val errors: RegistrationErrorsResponse?) {
    
        class Deserializer : ResponseDeserializable<RegistrationResponse> {
            override fun deserialize(content: String): RegistrationResponse? =
                Gson().fromJson(content, RegistrationResponse::class.java)
        }
    }
    
    data class RegistrationErrorsResponse(val phone: List<String>?) {
    
        class Deserializer : ResponseDeserializable<RegistrationErrorsResponse> {
            override fun deserialize(content: String): RegistrationErrorsResponse? =
                Gson().fromJson(content, RegistrationErrorsResponse::class.java)
        }
    }
    

    请求如下:

    class Api {
    
        init {
            FuelManager.instance.basePath = SERVER_URL
        }
    
        fun registration(name: String, phone: String): Request =
            "/registration/"
                .httpPost(listOf("name" to name, "phone" to phone))
    }
    
    private fun register(name: String, phone: String) {
        Api().registration(name, phone)
            .responseObject(RegistrationResponse.Deserializer()) { _, response, result ->
                val registrationResponse = result.component1()
                if (registrationResponse?.success == 1) {
                    showScreen()
                } else {
                    showErrorDialog(registrationResponse?.errors?.phone?.firstOrNull())
                }
            }
    }
    

    问题是当发生错误时, phone 数据类中的变量(注册响应?错误?.phone)已填充 null ,但不是“不正确的电话号码”。

    1 回复  |  直到 6 年前
        1
  •  0
  •   CoolMind    6 年前

    在研究了燃料问题之后,我明白在大多数情况下,我们不需要编写自己的反序列化程序,因为它们已经由 Gson .

    https://github.com/kittinunf/Fuel/issues/265 有一个例子。所以,只需将数据类放入 <> :

    URL.httpPost(listOf("name" to name, "phone" to phone)).responseObject<RegistrationResponse> ...
    

    并获取数据

    result.component1()?.errors?.phone?.firstOrNull()
    

    旧版答案

    可能障碍是一张单子 反序列化
    1。 https://github.com/kittinunf/Fuel/issues/233
    2。 https://github.com/kittinunf/Fuel/pull/236 .

    我认为,默认情况下,fuel不使用gson反序列化。

    我还是不知道怎么做 反序列化 一个列表,但有这个值 表达 :

    ((result.component1().obj()["errors"] as JSONObject).get("phone") as JSONArray)[0]