【问题标题】:get JSONObject inside JSONObject by Retrofit2 POST request通过 Retrofit2 POST 请求在 JSONObject 中获取 JSONObject
【发布时间】:2021-09-13 17:32:41
【问题描述】:

我正在使用 Kotlin 制作需要网络通信的 android 应用程序。

我一直无法通过Retrofit2 响应在JSONObject 中检索JSONObject

首先我创建了一个 JsonObjBase 类,以从 @POST 请求中获取 response.body()。

JsonObjBase

data class JsonObjBase (
    @SerializedName("ResultCode") val resultCode : Int,
    @SerializedName("ResultValue") val resultValue : String,
    @SerializedName("ResultMessage") val resultMessage : String,
    @SerializedName("Data") val data : JSONObject
)

还有一个Inteface 用于改造。

interface APICall {

    @POST("/api/Login")
    fun startLogin(@Body jsonObj: Operator) : Call<JsonObjBase>

    companion object {
        fun create() : ApiInterface {
            val retrofit = Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(StaticValue.baseUrl)
                .build()

            return retrofit.create(ApiInterface::class.java)
        }
    }
}

这是我在 Activity 中提出的改造请求。

活动

val apiInterface = ApiInterface.create().startLogin(opInfo)
apiInterface.enqueue(object : Callback<JsonObjBase> {
    override fun onResponse(call: Call<JsonObjBase>, response: Response<JsonObjBase>?) {
        if (response?.body() != null) {
            // TODO
        }
    }

    override fun onFailure(call: Call<JsonObjBase>, t: Throwable) {
        TODO("Not yet implemented")
    }
})

int 和 String 值正常接收,但是,我无法检索 "Data"(我想要的形式为 JSONObject

我只有空的 JSONObject 数据,

{ "ResultCode": 1, "ResultValue": null, "ResultMessage": null, "Data": {} }

如何在响应 JSONObject 中成功检索 JSONObject?

【问题讨论】:

  • 你能为JSONObject 添加一些代码吗?也许你是那个任务注释?
  • 请使用 ROBO pOJO 类生成器从您的 api respopnse 生成数据类。它是一个 android studio 插件,可帮助您防止此类问题。我用它和 gson 一起使用。
  • @GuneshShanbhag 感谢帮助,没想到 ROBOPOJO 会为我制作Data 数据类,真的帮了大忙!

标签: android kotlin


【解决方案1】:

感谢@Gunesh Shanbhag,我首先使用了 ROBO POJO 生成器。

这是它制作的两个数据类。

ApiResult 中,Data 在我的整个应用程序中有多个选项,所以我使用Any 来获取 JSONObject、JSONArray、String 等。

ApiResult

data class ApiResult(

    @field:SerializedName("Data")
    val data: Any? = null,

    @field:SerializedName("ResultValue")
    val resultValue: String? = null,

    @field:SerializedName("ResultMessage")
    val resultMessage: String? = null,

    @field:SerializedName("ResultCode")
    val resultCode: Int? = null
)

响应数据

data class ResponseData(

    @field:SerializedName("UserName")
    val userName: String? = null,

    @field:SerializedName("Enabled")
    val enabled: Int? = null,

    ...
)

在Activity中,由于DataAny,我有一个转换过程:

活动


// for Class Operator
val type = object : TypeToken<Operator>(){}.type
val g = Gson()
val result = g.tojson(response.body()!!.data)
val resultOp = Operator(JSONObject(result))

// for String
val g = Gson()
val result = g.toJson(response.body()!!.data)
val resultStr = result.toString()

【讨论】:

  • 很高兴我的建议对您有所帮助。附言出于某种原因,我在您的答案中的姓名标签无法访问。
猜你喜欢
  • 2019-06-03
  • 2017-10-13
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多