您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# SpringBoot响应Json数据乱码怎么解决
## 引言
在使用SpringBoot开发Web应用时,返回JSON格式数据是最常见的场景之一。然而开发者经常会遇到响应数据出现中文乱码的问题,比如`{"name":"???"}`。本文将深入分析乱码产生的原因,并提供5种以上解决方案,帮助开发者彻底解决这一常见问题。
---
## 一、乱码问题的根本原因
### 1.1 字符编码基础
- UTF-8与ISO-8859-1编码差异
- HTTP协议中`Content-Type`的charset参数作用
- Spring默认使用的字符编码配置
### 1.2 典型乱码场景
```java
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
return new User("张三", 25); // 响应变为{"name":"???"}
}
}
@GetMapping(value = "/user", produces = "application/json;charset=UTF-8")
public User getUser() {
// ...
}
优点:精准控制单个接口的编码
缺点:需要每个接口单独配置
在application.yml
中添加:
spring:
http:
encoding:
force: true
charset: UTF-8
enabled: true
或通过配置类:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
converters.add(converter);
}
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder
.failOnEmptyBeans(false)
.failOnUnknownProperties(false)
.indentOutput(true)
.serializationInclusion(JsonInclude.Include.NON_NULL)
.timeZone(TimeZone.getDefault())
.simpleDateFormat("yyyy-MM-dd HH:mm:ss")
.defaultViewInclusion(true)
.modules(new JavaTimeModule())
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Bean
public FilterRegistrationBean<CharacterEncodingFilter> filterRegistrationBean() {
FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CharacterEncodingFilter());
bean.addUrlPatterns("/*");
bean.setInitParameters(Map.of(
"encoding", "UTF-8",
"forceEncoding", "true"
));
return bean;
}
对于内嵌Tomcat:
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(connector -> {
connector.setURIEncoding("UTF-8");
connector.setUseBodyEncodingForURI(true);
});
return factory;
}
Content-Type: application/json;charset=ISO-8859-1
curl -v http://localhost:8080/user
meta charset
无效统一编码标准:整个项目统一使用UTF-8编码
?useUnicode=true&characterEncoding=UTF-8
响应内容验证:
@Test
void testJsonEncoding() throws Exception {
mockMvc.perform(get("/user"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("张三"))
.andExpect(content().contentType("application/json;charset=UTF-8"));
}
多环境验证:
@Bean
public GsonHttpMessageConverter gsonHttpMessageConverter() {
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd")
.setPrettyPrinting()
.create();
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(gson);
converter.setDefaultCharset(StandardCharsets.UTF_8);
return converter;
}
# messages.properties
welcome.message=你好
配置:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages");
source.setDefaultEncoding("UTF-8");
return source;
}
通过本文介绍的多种解决方案,开发者可以根据项目实际情况选择最适合的方式。建议新项目直接采用方案2的全局配置,配合方案3的Jackson定制化配置,能够覆盖99%的JSON乱码场景。记住关键原则:确保从数据源到客户端的整个链路都使用统一的UTF-8编码。
参考文档:
- Spring官方文档 - HTTP Message Conversion
- RFC8259 - JSON规范 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。