You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Rest Template如何去除请求体数组元素的引号?

解决方案

你的代码生成错误请求体的核心原因:使用MultiValueMap封装参数时,将JsonArray通过joinToString()转为了单个字符串,导致RestTemplate把这个字符串作为params数组的唯一元素,最终出现多余引号和转义。

以下是几种可行的修正方案:

方案1:用Map<String, Any>直接构建请求体

val headers = HttpHeaders()
headers.contentType = MediaType.APPLICATION_JSON

val paramsList = listOf(1, 124, "ABC")
val requestBody = mapOf("params" to paramsList)

val request = HttpEntity(requestBody, headers)

val response = restTemplate.postForEntity(
    URL,
    request,
    String::class.java
)
return response.body

RestTemplate会自动将Map序列化为正确的JSON结构,params对应包含数字和字符串的数组,不会产生多余引号。

方案2:用JsonNode构建完整请求体

val headers = HttpHeaders()
headers.contentType = MediaType.APPLICATION_JSON

val objectNode = ObjectMapper().createObjectNode()
val arrayNode = objectNode.arrayNode()
arrayNode.add(1)
arrayNode.add(124)
arrayNode.add("ABC")
objectNode.set<JsonNode>("params", arrayNode)

val request = HttpEntity(objectNode, headers)

val response = restTemplate.postForEntity(
    URL,
    request,
    String::class.java
)
return response.body

直接通过Jackson的ObjectNode构建完整JSON结构,确保params数组的元素类型准确,序列化后完全符合预期格式。

方案3:自定义数据类(推荐)

// 定义请求体数据类
data class RequestBody(
    val params: List<Any>
)

// 业务代码中使用
val headers = HttpHeaders()
headers.contentType = MediaType.APPLICATION_JSON

val requestBody = RequestBody(listOf(1, 124, "ABC"))

val request = HttpEntity(requestBody, headers)

val response = restTemplate.postForEntity(
    URL,
    request,
    String::class.java
)
return response.body

通过数据类明确请求结构,代码可读性和可维护性更强,RestTemplate会自动完成正确的JSON序列化。

内容的提问来源于stack exchange,提问作者J.Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:54:34