Spring Boot接口如何强制将String返回值序列化为标准JSON格式?
问题:Spring Boot接口返回的String未序列化为标准JSON格式
我编写了如下Spring Boot接口代码:
@RestController @RequestMapping("api/v1/student") public class StudentController { @GetMapping public ResponseEntity<String> serviceOk() { return new ResponseEntity<>("service OK", HttpStatus.OK); } }
当前接口返回的内容是:
service OK
而非符合JSON规范的格式:
"service OK"
带双引号的"service OK"是有效的JSON格式,无引号的纯文本则不是。请问如何改造Web服务,强制将简单String类型也序列化为JSON格式?
解决方案1:用包装类封装String
这是最稳妥的常规方案,通过把String放到对象或集合中,让Jackson默认的序列化机制生成标准JSON:
方式1:用Map临时包装
@RestController @RequestMapping("api/v1/student") public class StudentController { @GetMapping public ResponseEntity<Map<String, String>> serviceOk() { Map<String, String> response = new HashMap<>(); response.put("message", "service OK"); return new ResponseEntity<>(response, HttpStatus.OK); } }
返回结果:{"message":"service OK"}
方式2:自定义响应类
如果需要统一接口返回格式,建议定义通用响应类:
// 通用响应类 public class ApiResponse<T> { private T data; public ApiResponse(T data) { this.data = data; } // getter方法 public T getData() { return data; } } // 控制器中使用 @RestController @RequestMapping("api/v1/student") public class StudentController { @GetMapping public ResponseEntity<ApiResponse<String>> serviceOk() { return new ResponseEntity<>(new ApiResponse<>("service OK"), HttpStatus.OK); } }
返回结果:{"data":"service OK"}
解决方案2:修改消息转换器,强制用Jackson序列化String
Spring默认会用StringHttpMessageConverter处理String类型的返回值,跳过Jackson序列化。我们可以移除这个转换器,让Jackson处理所有类型:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 移除默认的String转换器 converters.removeIf(converter -> converter instanceof StringHttpMessageConverter); // 添加Jackson转换器 MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); converters.add(jacksonConverter); } }
修改后,原接口会直接返回"service OK",符合JSON规范。注意:这个配置会全局生效,所有String类型的返回都会被序列化为带双引号的JSON字符串。
解决方案3:手动构造JSON格式字符串
这种方式适合简单场景,直接返回带双引号的字符串,并指定Content-Type为application/json:
@RestController @RequestMapping("api/v1/student") public class StudentController { @GetMapping public ResponseEntity<String> serviceOk() { // 手动添加双引号,注意转义字符串内部的双引号(如果有的话) String jsonResponse = "\"service OK\""; return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) .body(jsonResponse); } }
返回结果就是"service OK",符合JSON规范。
内容的提问来源于stack exchange,提问作者work-in-progress
相关产品推荐
相关产品推荐

