SpringBoot响应Json数据乱码怎么解决

发布时间:2021-12-07 14:50:42 作者:iii
来源:亿速云 阅读:333
# 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":"???"}
    }
}

二、解决方案大全

2.1 方案1:设置produces属性(推荐)

@GetMapping(value = "/user", produces = "application/json;charset=UTF-8")
public User getUser() {
    // ...
}

优点:精准控制单个接口的编码
缺点:需要每个接口单独配置

2.2 方案2:全局配置(最常用)

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);
    }
}

2.3 方案3:自定义Jackson配置

@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);
}

2.4 方案4:过滤器方式

@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;
}

2.5 方案5:修改Tomcat配置(传统项目)

对于内嵌Tomcat:

@Bean
public TomcatServletWebServerFactory tomcatFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(connector -> {
        connector.setURIEncoding("UTF-8");
        connector.setUseBodyEncodingForURI(true);
    });
    return factory;
}

三、深度排查技巧

3.1 诊断工具

  1. 使用Postman查看原始响应头
    
    Content-Type: application/json;charset=ISO-8859-1
    
  2. 通过curl命令验证:
    
    curl -v http://localhost:8080/user
    

3.2 常见误区


四、最佳实践建议

  1. 统一编码标准:整个项目统一使用UTF-8编码

    • IDE文件编码设置
    • 项目配置文件编码
    • 数据库连接字符串添加?useUnicode=true&characterEncoding=UTF-8
  2. 响应内容验证

    @Test
    void testJsonEncoding() throws Exception {
       mockMvc.perform(get("/user"))
              .andExpect(status().isOk())
              .andExpect(jsonPath("$.name").value("张三"))
              .andExpect(content().contentType("application/json;charset=UTF-8"));
    }
    
  3. 多环境验证

    • 开发环境使用H2内存数据库
    • 测试环境使用MySQL
    • 生产环境使用Oracle

五、扩展知识

5.1 其他序列化框架

5.2 国际化场景处理

# 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规范 “`

推荐阅读:
  1. Jmeter之响应结果乱码解决
  2. java读取json数据发生中文乱码的解决方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot json

上一篇:OAuth协议的授权模式有哪些

下一篇:hadoop1.1.2如何配置及启动

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》