为什么ObjectMapper调用writeValue方法写入文件不生效?
Java写入JSON文件不生效的常见原因及解决方案
可能的原因
- 路径匹配错误:你代码中使用
Paths.get("allPost.json")是相对路径,默认相对于Java进程的工作目录(IDEA启动时一般为项目根目录),并不会自动写入到src/main/resources目录下。大概率文件已经生成在项目根目录,只是你找错了位置。 - ObjectMapper用法错误:
objectMapper.writeValue的作用是将Java对象序列化为JSON后写入文件,你传入的第二个参数是已经序列化好的JSON字符串response.body(),会触发二次序列化,最终写入的内容是带转义符的字符串,并不是你预期的原生JSON结构,容易被误认为写入失败。 - 代码未执行到写入逻辑:
readValue方法如果JSON解析失败会直接抛出异常进入catch分支,跳过后续的写入代码,你可以先检查控制台是否有相关异常栈打印。 - 文件写入权限不足:如果项目存放在系统级受保护目录(比如Windows的
Program Files、Linux的/root目录),Java进程没有写入权限也会写入失败,通常会抛出FileNotFoundException或AccessDeniedException。 - 资源目录同步问题:Maven/Gradle项目运行时读取的是
target/classes(对应Gradle的build/classes)下的编译后资源,你就算写入到src/main/resources,没有重新构建项目的话,编译目录下的文件也不会同步更新,而且打包成Jar后resources目录属于只读ClassPath资源,无法直接写入修改。
修复方案
- 修正写入路径,明确指定要写入的资源目录路径:
// 写入到src/main/resources下的allPost.json Path targetPath = Paths.get("src/main/resources/allPost.json");
- 修正写入逻辑,避免二次序列化:
如果你要直接写入接口返回的原生JSON字符串,不需要用ObjectMapper,直接用JDK自带的文件写入即可:
Files.write(targetPath, response.body().getBytes(StandardCharsets.UTF_8));
如果你要将转换后的Java对象序列化后写入,传入解析好的postPojos即可:
objectMapper.writeValue(targetPath.toFile(), postPojos);
- 补充异常判断逻辑,确认写入流程是否正常执行,也可以在写入后打印文件的绝对路径,方便定位文件位置:
System.out.println("文件写入路径:" + targetPath.toAbsolutePath());
- 打包后运行的场景不要写入resources目录,改为写入Jar包同级目录、系统临时目录或用户目录等可写路径。
内容的提问来源于stack exchange,提问作者Денис Задорожний
相关产品推荐
相关产品推荐

