如何解决Android Kotlin中Volley发送JSON格式错误的问题
解决方案
问题根因
- 你当前重写的
getParams()是Volley用于提交application/x-www-form-urlencoded表单格式的方法,不会输出标准JSON结构 - 直接调用集合/对象的
toString()返回的是JVM默认的对象字符串格式,不是序列化后的标准JSON,所以会出现Id=1233而非"Id":"1233"的异常格式
修复步骤
方案1:使用系统自带org.json库构造JSON(无需额外依赖)
- 先构造符合格式的JSON对象
// 构造外层JSON对象 val requestJson = JSONObject() requestJson.put("Id", "1233") // 构造SelRefids对应的JSON数组 val refidsJsonArray = JSONArray() payarray.forEach { item -> val refItemJson = JSONObject() refItemJson.put("Refno", item.refno) // 替换为你payarray元素对应的属性取值 refItemJson.put("H_dt", item.hDt) // 替换为你payarray元素对应的属性取值 refidsJsonArray.put(refItemJson) } requestJson.put("SelRefids", refidsJsonArray)
- 自定义Volley请求,重写getBody和ContentType,不要使用
getParams()
val jsonRequest = object : JsonObjectRequest( Method.POST, "你的接口地址", null, { response -> // 接口成功回调逻辑 }, { error -> // 接口失败回调逻辑 } ) { // 返回JSON格式的请求体 override fun getBody(): ByteArray { return requestJson.toString().toByteArray(Charsets.UTF_8) } // 声明请求体格式为JSON override fun getBodyContentType(): String { return "application/json; charset=utf-8" } // 如有请求头要求可重写该方法添加 override fun getHeaders(): MutableMap<String, String> { val headers = HashMap<String, String>() // headers["Authorization"] = "Bearer 你的鉴权token" return headers } } // 将请求添加到Volley队列 Volley.newRequestQueue(context).add(jsonRequest)
方案2:使用Gson序列化(更简洁,适合复杂结构)
- 先定义请求参数对应的数据类
data class PostBody( val Id: String, val SelRefids: List<RefItem> ) data class RefItem( val Refno: String, val H_dt: String )
- 构造请求对象并序列化
// 构造请求参数,payarray只要是符合RefItem结构的集合即可 val postBody = PostBody(Id = "1233", SelRefids = payarray) // Gson序列化得到标准JSON字符串 val jsonStr = Gson().toJson(postBody)
- 后续Volley请求的
getBody()直接返回jsonStr.toByteArray(Charsets.UTF_8)即可,其余逻辑和方案1一致。
内容的提问来源于stack exchange,提问作者basil
相关产品推荐
相关产品推荐

