Retrofit设置对某个数据返回不解析

本文讲述了在后端返回特殊JSON结构时,如何使用ResponseBody和JSONObject处理数据,包括使用`StatementCalls`接口获取原始数据,解析`statement_data`并存储至`TenementStatementRecyclerData`对象,以及注意事项,如避免多次订阅响应体导致空值。
摘要由CSDN通过智能技术生成

总有些时候,后端给你的数据是比较特殊的,不能轻易的把返回json转换成对象,比如以下数据

{
    "code": 200,
    "message": "成功",
    "data": {
        "income": "667.06",
        "statement_data": {
            "2023-11": {
                "income": "542.00",
                "expend": "0.00"
            },
            "2023-12": {
                "income": "125.06",
                "expend": "0.00"
            }
        }
    }
}

因为key的名称是不确定的,所以不能让retrofit 转。我们需要获取原数据。
把返回数据改成ResponseBody

sealed interface StatementCalls {
   @FormUrlEncoded
    @POST("/api/{user}/statement")
    fun getStatement(
        @Path("user") user: String,
        @FieldMap map: Map<String, String>
    ):Call<ResponseBody>
    }

异步返回之后,调用 responeBody.string()方法,解析json。在本例中,遍历statement_data的keys,

            val statementData=JSONObject(json)
            				.getJSONObject("data")
            				.getJSONArray("statement_data")
            val dataList = mutableListOf<TenementStatementRecyclerData>()
            for (index in 0 until statementData.length()) {
                val jsonObject = statementData.getJSONObject(index)
                val incomeMoney = jsonObject.getString("income")
                val paidMoney = jsonObject.getString("expend")
                val tenementStatementBean = TenementStatementRecyclerData(
                    income = incomeMoney,
                    expend = paidMoney
                )
                dataList.add(tenementStatementBean)
            }

如果json又臭又长,那么强烈建议,构建jsonObject的时候就获取data字段,不然很容易在茫茫的Java代码中迷失……

val dataJson=JSONObject(json).getJSONObject("data")

responeBody.string()只返回一次响应体字符串,需要注意订阅等一些操作,比如,在多个地方订阅这个body,需要把string储存起来,否则会返回空值。

viewModel.statement.filterNotNull().collect{
val response=it.string()
...
}
//在另一处
viewModel.statement.filterNotNull().collect{
val response=it.string()//不要这么做.后收集会返回空值
...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值