首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用retrofit2 Kotlin解析响应

如何使用retrofit2 Kotlin解析响应
EN

Stack Overflow用户
提问于 2021-09-11 23:11:34
回答 1查看 539关注 0票数 1

我一直在分析反应。在Swift中,我可以编写一个可编码的代码来帮助解析json响应。我是科特林的新手,我正在从事另一个现有的项目。我为字符串和布尔创建了一个数据类,但是我不知道解析它的语法。请帮忙,谢谢。

responseBody json

代码语言:javascript
运行
复制
{
    "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...
        }
    })
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-11 23:37:02

我认为,要实现类似于可编码的应用程序,最好的选择是使用Gson库来解析api响应。

在创建翻新实例时,可以将gson转换器传递给构建器,如下所示:

代码语言:javascript
运行
复制
val retrofit = Retrofit.Builder()  
            .baseUrl(BaseUrl)  
            .addConverterFactory(GsonConverterFactory.create())  
            .build() 

完成之后,可以让api返回作为数据类的响应,如下所示:

代码语言:javascript
运行
复制
//Interface
interface PostInterface {

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

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

要获得更多信息,您可以参考改装库页面,其中给出了如何正确使用它的所有细节和解释。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69147338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档