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

Spring Boot接口返回JSON时code字段为转义字符串问题求解

问题根因

你调用POST新增接口时,请求体传入的是类似{"code":"hello world"}的JSON格式数据,而POST接口的@RequestBody直接声明为String类型,Spring MVC会将整个请求体的JSON原始字符串直接赋值给code参数,最终存储到Code实体的code字段中的值就是{"code":"hello world"}这个完整字符串。
当你调用GET接口返回Code对象时,Spring的JSON序列化工具会把code字段的字符串内容做转义处理,所以就出现了"{\"code\":\"hello world\"}"的异常格式,和你预期的直接返回hello world不符。


解决方案

方案1(最推荐):修改POST接口参数类型,自动解析JSON

不要直接用String接收请求体,而是用实体类或者Map接收,让Spring自动帮你解析JSON里的字段:

实现1:用DTO类接收(适合正式项目规范)

// 新增请求DTO类
public class CodeAddRequest {
    private String code;
    // 补全getter、setter方法
}

// 修改POST接口
@PostMapping("/api/code/new")
@ResponseBody
public Map<String, Integer> addNewCode(@RequestBody CodeAddRequest request) {
    Code newCode = new Code(request.getCode());
    codeList.add(newCode);
    // 直接返回对象,Spring自动转JSON,不需要手动拼接字符串
    return Map.of("id", newCode.getId());
}

实现2:用Map快速接收(适合简单接口)

@PostMapping("/api/code/new")
@ResponseBody
public Map<String, Integer> addNewCode(@RequestBody Map<String, Object> params) {
    String code = params.get("code").toString();
    Code newCode = new Code(code);
    codeList.add(newCode);
    return Map.of("id", newCode.getId());
}

方案2:保留String接收,手动解析JSON

如果确实需要用String接收原始请求体,就手动解析JSON提取对应字段:

@PostMapping("/api/code/new")
@ResponseBody
public Map<String, Integer> addNewCode(@RequestBody String codeStr) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(codeStr);
    String realCode = jsonNode.get("code").asText();
    Code newCode = new Code(realCode);
    codeList.add(newCode);
    return Map.of("id", newCode.getId());
}

修改完成后,存储到Code实体code字段的就是纯文本hello world,GET接口返回序列化后自然会输出你预期的格式。


内容的提问来源于stack exchange,提问作者Tomek Nowak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:36:05