java读取json中文乱码需用inputstreamreader指定utf-8编码;jackson反序列化要加@jsonproperty或@jsonnaming匹配字段;单选题评分须统一用索引比对,避免字母与索引混用。

Java 读取题目 JSON 文件时中文乱码怎么办
Java 默认用平台编码读文件,Windows 上常是 GBK,而题目文件多为 UTF-8 编码,直接用 FileReader 必然乱码,String 解析后题干变问号或方块。
- 改用
InputStreamReader显式指定 UTF-8:new InputStreamReader(new FileInputStream("questions.json"), StandardCharsets.UTF_8) - Spring Boot 项目更推荐用
Resource+StreamUtils.copyToByteArray(),再转String,避免路径和 classpath 加载问题 - 别信 IDE 的“文件编码已设为 UTF-8”——它只影响编辑显示,不改变
FileReader行为
用 Jackson 反序列化题目列表时字段为空或报错
JSON 字段名是 question_text,但 Java 类里写了 questionText,Jackson 默认不匹配,导致所有字段为 null,或者抛 UnrecognizedPropertyException。
- 加注解
@JsonProperty("question_text")到对应字段,或统一用@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)在类上 - 确保题目 JSON 数组顶层结构和 Java 泛型一致:要反序列化成
List<question></question>,就别漏掉TypeReference:mapper.readValue(json, new TypeReference<list>>() {})</list> - 如果题目含选项数组(如
options: ["A. xxx", "B. yyy"]),Java 类中字段类型必须是List<string></string>,不是String[]或ArrayList—— Jackson 对泛型擦除敏感
单选题自动评分逻辑写错导致对错颠倒
用户提交的 answer 是选项索引(如 0 表示选 A),但代码拿它去和 correctAnswer 字符串(如 "A")直接比较,永远为 false;或者把用户选的字母当索引去查数组,越界抛异常。
- 统一数据表示:后端存储正确答案用索引(
int correctIndex),前端传来的也是索引,比对直接用== - 若必须存字母(如历史兼容),解析时立刻转索引:
"A".charAt(0) - 'A',但注意大小写和非法字符,加if (s.length() == 1 && s.charAt(0) >= 'A' && s.charAt(0) 校验 - 多选题别用
equals比List—— 顺序可能不同,改用new HashSet(user).equals(new HashSet(correct))
并发提交考试时评分结果不一致
多个用户同时交卷,共享一个 ScoreService 实例,其中用了静态变量缓存题目答案或临时计算状态,导致张三的答案被李四覆盖,分数算错。
立即学习“Java免费学习笔记(深入)”;
- 彻底移除所有静态集合、静态计数器、静态
Map—— 评分逻辑必须无状态,输入题目数据 + 用户答案 → 输出得分,中间不依赖任何共享变量 - 如果用了 Spring Bean,确认它是
@Scope("prototype")或方法级局部变量;@Service默认单例,但只要方法内不写静态/成员变量就安全 - 别为了“省对象创建”在循环里复用
HashMap,每次新建new HashMap()开销极小,且绝对线程安全
真正容易被忽略的是 JSON 字段命名策略和 Jackson 的泛型反序列化——这两个点不显眼,但一旦出错,调试时看到的全是 null 或空集合,根本想不到是配置或类型声明的问题。










