当前位置: 首页 > 知识库问答 >
问题:

如何正确地创建可重用类来使用refitfit捕获响应数据?

秦才英
2023-03-14

我是Android开发的新手,我正试图从服务器获取数据。一般的JSON响应结构如下所示

{
    "success": "1",
    "data": [
        {
            "customers_id": 4,
            "customers_gender": "0",
            "customers_firstname": "TES IOS",
            "customers_lastname": "TES IOS",
            "customers_dob": "2018-12-27",
            "email": "TES002@email.com",
            "user_name": "TES002",
            "customers_default_address_id": 0,
            "customers_telephone
         },
    "message": "Successfully get user data from server"
}

“Success”和“Message”字段将是相同的(将始终是字符串)。但是对于其他请求调用,“数据”可能不同。它可以发送用户数据,存储数据或产品数据,甚至是产品的数组/列表。

因此,我想创建一个通用的可重用类来捕捉JSON响应。类将如下所示,我将“data”设置为Any,然后稍后它将被铸回User Object:

class ServerData(successStatus: Int, data: Any, message: String) {

    val isSuccessfull : Boolean
    val data : Any
    val message : String


    init {
        isSuccessfull = successStatus != 0
        this.data = data
        this.message = message
    }


}
interface LakuinAPI {

    @FormUrlEncoded
    @POST("processlogin")
    fun performLogin(
        @Field("kode_customer") outletCode: String,
        @Field("password") password: String
    ): Call<ServerData>


}

然后我在活动中使用它,如下面的代码:

private fun sendLoginDataToServer(outletCode: String, password: String) {

        val call = lakuinAPI.performLogin(outletCode,password)

        call.enqueue(object: Callback<ServerData> {

            override fun onFailure(call: Call<ServerData>, t: Throwable) {
                Toast.makeText(this@LoginActivity,t.localizedMessage,Toast.LENGTH_LONG).show()
            }

            override fun onResponse(call: Call<ServerData>, response: Response<ServerData>) {

                if (!response.isSuccessful) {
                    Toast.makeText(this@LoginActivity,"Code: " + response.code(),Toast.LENGTH_LONG).show()
                    return
                }

                val lakuinServerData = response.body()
                val userList = lakuinServerData?.data as List<User> // the error in here
                val userData = userList.first() // the error in here
                println(userData)

            }

        })


    }

但我得到错误消息:

classCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为com.ssss.lakuinkotlin.model.user

老实说,如果这是从像上面的JSON一样的一般响应JSON捕获用户数据的正确方法,我就不这么认为了。有更好的办法吗?

共有1个答案

严斌
2023-03-14

可以使用泛型来实现

class Response<Data> constructor() : ResponseSimple() {
   @SerializedName(FIELD_DATA)
   var data: Data? = null
   private constructor(data: Data) : this() {
       this.data = data
   }
   companion object {
       const val FIELD_SUCCESS = "success"
       const val FIELD_ERROR = "error"
       const val FIELD_DATA = "data"
       const val FIELD_MESSAGE = "message"

       @JvmStatic
       fun <Data> create(data: Data): Response<Data> {
          return Response(data)
       }
   }
}

responseSimple

open class ResponseSimple {

@SerializedName(Response.FIELD_ERROR)
var error: String = ""

@SerializedName(Response.FIELD_SUCCESS)
var succes: Boolean = false

@SerializedName(Response.FIELD_MESSAGE)
var message:String = ""
}

那么api响应应该是调用 >

关于ClassCastException,您不能仅使用作为ServerData转换为User。您需要使用调用 list >> 或创建类转换器。

 类似资料:
  • 我有一个基于springboot的restful Web服务。我有CryptoResponseBodyAdvision从控制器捕获响应,从响应体中创建JWE并将JWE作为API响应发送。公共类CryptoResponseBodyAdvice实现ResponseBodyAdvice 当某些异常发生并请求到达异常解决程序时,麻烦就来了。在这种异常场景中,响应不受CryptoResponseBodyAd

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我有一个打算用作实用程序文件的文件。该文件应包含许多静态方法。 我应该这样在类中定义方法吗: 或像这样使用它(不带类): 问题答案: 第二个选项是Python中的操作方法。我的意思是,如果您要做的只是导入函数,那么您可以执行以下操作:

  • 问题内容: 我正在尝试使用Bokeh而不是matplotlib复制此问题中显示的HeatMap。我不能完全正确。现有的示例并没有帮助我了解我在做什么错。我卑微的尝试 给 请注意,尽管标题相似,但这并不能回答我的问题。这不是相同的错误,我正在使用Bokeh 0.12.3 问题答案: 更改数据的生成以按元素重复,并且它应该是正确的: 因此,适用于我的代码如下:

  • 问题内容: 我对ObjectMapper的工作方式和应用程序的一般使用感到满意。我想了解的是实现ObjectMapper的最佳方法,以确保其被重用并且不会在应用程序内创建不必要的实例? 我的想法是,可以在Utils类中声明ObjectMapper,如下所示: 然后,我可以在不同的地方使用诸如以下代码来引用: 我遇到了另一个问题(我应该将杰克逊的ObjectMapper声明为静态字段吗?),这促使我

  • 嘿,我必须使用 JOptionPane 向用户询问购买金额,如果他们输入超过小数点后两位、任何内容、字符或多于小数点,程序必须显示错误消息并停止。 我该怎么做? 我不希望有人为我编写程序,只是一个解释我将如何做的链接 如果用户输入“12.526”或“”或“1.3.25”或“abc”,我希望程序显示错误消息并停止。 由于这似乎是一个令人困惑的问题,或者我问错了,这些是我的老师的指示: 程序必须要求用

  • 问题内容: 网页上的数据是动态显示的,似乎检查html中的每个更改并提取数据是一项非常艰巨的任务,并且还需要我使用非常不可靠的XPath。因此,我希望能够从数据包中提取数据。 我希望能够从数据包中提取信息以及生成要发送到服务器的“ XHR”数据包。提取信息部分对我来说更重要,因为通过使用casperjs自动触发html元素可以轻松处理信息的发送。 我附上我的意思的屏幕截图。 响应选项卡中的文本是我