【问题标题】:I cannot parse Json data from retrofit what's the problem?我无法从改造中解析 Json 数据有什么问题?
【发布时间】:2021-12-21 01:23:37
【问题描述】:

这是我的代码

interface ApiService {

@POST("sms-otp/request")
suspend fun loginTest(@Body testRequest: TestRequest): Response<TestResponse>
}


data class TestResponse(

@SerializedName("otp")
@Expose
var otp : String? = null,

@Expose
@SerializedName("otpId")
var otpId: Int? = null
)

逻辑-

  loginRepository.loginTest(testRequest.phoneNumber!!).let {
        if (it.isSuccessful) {

            _res.postValue(Resource.success(it.body()))
            Log.d("_res", it.body().toString())
            Log.d("_res" , _res.value.toString())
            Log.d("_res", _res.value?.data.toString())

        } else {
            _res.postValue(Resource.error(it.errorBody().toString(), null))
        }
    }

这是我的日志,我认为响应代码是 201,可能成功但我的模型中没有数据...请帮助我

enter image description here

【问题讨论】:

  • 节点“otp”和“otpId”不属于根JSON节点,它们被放置在“数据”中。因此,TestResponse 类应该有一个名为data 的字段,其中包含嵌套字段otpotpId

标签: android kotlin mvvm retrofit android-livedata


【解决方案1】:

您正在收到来自服务器的响应,正如 okhttp 日志记录所显示的那样。但是,改造无法映射它。因为您的响应有错误的 kotlin 数据类。

{
  "code": "0000",
  "message": "ok",
  "data": {
    "otpId": 21,
    "otp": "518793"
  }
}

响应在 data 对象中包含 otpData,但您的 TestResponse 仅包含 otp 属性。

为了正确映射改造,您必须定义两个数据类,一个用于父响应,一个用于otpData

TestResponse.kt改成这个

data class TestResponse(
    @SerializedName("code")
    @Expose
    val code: String,
    @SerializedName("data")
    @Expose
    val otpData: OtpData,
    @SerializedName("message")
    @Expose
    val message: String
)

现在,创建OtpData.kt

data class OtpData(
    @SerializedName("otp")
    @Expose
    val otp: String,
    @SerializedName("otpId")
    @Expose
    val otpId: Int
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2016-05-22
    相关资源
    最近更新 更多