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

SpringBoot Restful API返回JSON特殊字符编码异常问题求助

问题解决与代码优化建议

一、JSON响应编码问题解决

控制台打印正常说明CSV读取环节编码无误,问题出在Spring Boot返回JSON时的编码配置,以下是几种解决方式:

1. 全局配置(推荐)

在application.properties中添加以下配置,强制响应使用UTF-8编码:

spring.http.encoding.force-response=true
spring.jackson.charset=UTF-8

如果用application.yml则对应:

spring:
  http:
    encoding:
      force-response: true
  jackson:
    charset: UTF-8

2. 接口级配置

不想全局修改的话,可在Controller的接口方法上指定响应编码:

@GetMapping(value = "/car/{id}", produces = "application/json;charset=UTF-8")
public ResponseEntity<Car> getCarById(@PathVariable Long id) {
    // 业务逻辑
}

3. 确认CSV读取编码(兜底检查)

虽然控制台显示正常,仍建议明确指定opencsv读取CSV时的编码,避免潜在问题:

try (Reader reader = new InputStreamReader(new FileInputStream("abc.csv"), StandardCharsets.UTF_8)) {
    CSVReader csvReader = new CSVReader(reader);
    // 读取逻辑
}

如果CSV文件是GBK等其他编码,替换为对应StandardCharsets常量即可。


二、新手代码优化建议

1. 实体类规范优化

  • 引入Lombok的@Data注解,自动生成getter/setter/toString等方法,减少冗余代码(需在build.gradle中添加Lombok依赖):
@Data
public class Car {
    @CsvBindByName(column = "id") // 与CSV表头映射,opencsv读取更清晰
    private Long id;
    @CsvBindByName(column = "brand")
    private String brand;
    // 其他字段
}
  • 用@JsonProperty明确JSON返回字段名,避免大小写或命名规则不一致的问题。

2. 工具类与业务逻辑分离

  • 不要硬编码CSV文件路径,通过配置文件注入路径:
    在application.properties添加csv.file.path=classpath:abc.csv,然后在工具类中用@Value("${csv.file.path}")注入。
  • 将ReadInCSV标记为@Component,交给Spring管理,避免重复创建对象;同时添加异常处理,比如文件不存在时抛出明确异常或返回空集合。
  • 新增Service层,把从CSV数据中查找Car的逻辑从Controller中剥离,Controller只负责接收请求和返回响应,Service处理业务逻辑,代码结构更清晰。

3. Controller规范优化

  • 使用@RestController替代@Controller,API接口无需视图解析。
  • 处理请求时判断资源是否存在,不存在返回404状态码:
@GetMapping("/car/{id}")
public ResponseEntity<Car> getCarById(@PathVariable Long id) {
    Car car = carService.getCarById(id);
    if (car == null) {
        return ResponseEntity.notFound().build();
    }
    return ResponseEntity.ok(car);
}

4. 项目结构规范

按分层结构整理代码,更符合Spring Boot最佳实践:

  • com.example.so.entity:存放实体类(Car)
  • com.example.so.controller:存放控制器(CarController)
  • com.example.so.service:存放业务逻辑(CarService)
  • com.example.so.util:存放工具类(ReadInCSV)
  • com.example.so:启动类(SoApplication)

5. 依赖管理补充

如果使用Lombok,需在build.gradle中添加依赖:

dependencies {
    implementation 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:03:25