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
相关产品推荐
相关产品推荐

