如何使用 retrofit2 Kotlin 解析响应

How to parse response with retrofit2 Kotlin

我无法解析响应。在 Swift 中,我可以创建一个代码来帮助解析 json 响应。我是 Kotlin 的新手,正在处理其他人的现有项目。我为字符串和布尔值创建了一个数据 class,但我不知道解析它的语法。请帮忙,谢谢。

响应主体json

{
    "bearerToken": "########",
    "staySignIn": false
} 



    //Interface
    interface PostInterface {
    class User(
        val email: String,
        val password: String
    )

    @POST("signIn")
    fun signIn(@Body user: User): Call<ResponseBody>

    //Network handler
    fun signIn(email: String, password: String): MutableLiveData<Resource> {
            val status: MutableLiveData<Resource> = MutableLiveData()
            status.value = Resource.loading(null)
    
            val retrofit = ServiceBuilder.buildService(PostInterface::class.java)
            retrofit.signIn(PostInterface.User(email, password)).enqueue(object : Callback<ResponseBody> {
                override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                    errorMessage(status)
                }
                override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                    if (response.code() == 200) {
                        try {
                            status.value = //how to parse using the model??
    
                        } catch (ex: Exception) {
                            parseError(400, response.body().toString(), status)
                        }
                    } else {
                        //do something...
                    }
                }
            })
            return status
        }

    //Model
    data class SignInModel(
    
        @field:SerializedName("bearerToken")
        val bearerToken: String? = null,
    
        @field:SerializedName("staySignIn")
        val staySignIn: Boolean? = null
    )

    //Storing value class
    class RrefManager constructor(var applicationContext: Context) {
       private fun getSharedPrefEditor(): sharedPrefEditor.Editor {
         return applicationContext.getSharedPrefEditor(prefStorageName, Context.MODE_PRIVATE).edit()
       }

       public fun setBearerToken(token: String) {
          getSharedPrefEditor().putString("bearerToken", token).apply()
       }

       public fun setStaySignIn(enabled: Boolean) {
          getSharedPrefEditor().putBoolean("staySignIn", enabled).apply()
       }
    }

    //SignIn Button
    viewModel.signIn().observe(viewLifecycleOwner, androidx.lifecycle.Observer { v ->
       if (v.status == Resource.Status.SUCCESS) {   
       val model = v.data as SignInModel
           pref.setToken(model.token as String) //storing value
           pref.setTwoFactorEnabled(model.twoFactorEnabled as Boolean) //storing value
        } else if (v.status == Resource.Status.ERROR) {
          //do something...
        }
    })

我认为实现类似 swift 中的可编码功能的最佳选择是使用 Gson 库来解析 api 响应。

当您创建改造实例时,您将 gson 转换器传递给构建器,例如:

val retrofit = Retrofit.Builder()  
            .baseUrl(BaseUrl)  
            .addConverterFactory(GsonConverterFactory.create())  
            .build() 

完成后,您可以将 api return 作为数据 class 的响应,例如:

//Interface
interface PostInterface {

     @POST("signIn")
     fun signIn(@Body user: User): Call<SignInModel>
}

要从您的 class 上的回调中读取答案,网络调用中的响应已经在回调中解析到您的模型中。所有的改造回调都应该改为接收回调然后你可以直接访问像 status.value = response.body()

有关更多信息,您可以查阅改装库页面,其中提供了有关如何正确使用它的所有详细信息和说明。

https://square.github.io/retrofit/