Java获取目录下JSON文件名后如何读取内容并转换为对象
实现方法
你已经拿到了/data目录下的文件名列表,只需要给每个文件名拼接/data/前缀得到单个JSON文件的classpath路径,再通过getResourceAsStream获取对应文件的输入流,即可读取文件内容、完成JSON转对象操作。
先修正你原代码的两个问题:
- 变量名笔误:定义的
BufferedReader变量名是b,调用lines()时写的是bufferedReader,运行会报变量不存在 - 读取流未指定字符集,遇到中文会乱码,固定使用UTF-8即可
完整可运行代码如下(以常用的Jackson JSON解析库为例):
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.stream.Collectors; public class MyClass { // JSON解析工具全局单例复用,避免重复创建开销 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); // 目标实体类,字段和JSON属性对应即可,需提供无参构造、getter、setter public static class JsonBizData { private Integer id; private String content; public JsonBizData() {} public Integer getId() {return id;} public void setId(Integer id) {this.id = id;} public String getContent() {return content;} public void setContent(String content) {this.content = content;} } public static void main(String[] args) throws Exception { List<String> jsonFileNames; // 自动关闭流,避免资源泄漏 try (InputStream dirIs = MyClass.class.getResourceAsStream("/data"); InputStreamReader dirReader = new InputStreamReader(dirIs, StandardCharsets.UTF_8); BufferedReader dirBufferedReader = new BufferedReader(dirReader)) { jsonFileNames = dirBufferedReader.lines() // 过滤非json后缀的文件、子目录、系统隐藏文件 .filter(name -> name.endsWith(".json")) .collect(Collectors.toList()); } // 遍历读取每个JSON文件 for (String fileName : jsonFileNames) { String singleFilePath = "/data/" + fileName; try (InputStream jsonIs = MyClass.class.getResourceAsStream(singleFilePath)) { // 直接转成目标实体对象 JsonBizData data = OBJECT_MAPPER.readValue(jsonIs, JsonBizData.class); System.out.printf("读取文件%s,解析结果:id=%d,content=%s%n", fileName, data.getId(), data.getContent()); // 如果不需要转对象,只想获取原始JSON字符串,用下面的写法 // String jsonRaw = new String(jsonIs.readAllBytes(), StandardCharsets.UTF_8); // System.out.printf("文件%s原始内容:%s%n", fileName, jsonRaw); } } } }
注意事项
- 目录位置要求:
data文件夹必须在classpath根目录下。如果是Maven/Gradle项目,放在src/main/resources目录下即可;如果是普通Java项目,放在src根目录下,确保编译后data目录和class文件在同一输出根路径。 - 不要用
java.io.File读取classpath下的资源:本地IDE运行时可能正常,但项目打包成可执行jar后,资源被压缩在jar包内部,文件系统不存在对应实体文件,会抛出FileNotFoundException,必须通过流的方式读取才能兼容所有部署场景。 - JSON解析库可按需替换:示例用的是Spring生态默认集成的Jackson,换成Fastjson2、Gson逻辑完全一致,只需把单个文件的流传入对应解析方法即可。
- 不要省略文件后缀过滤:读取目录得到的列表可能包含子目录、系统生成的隐藏文件(比如macOS下的
.DS_Store),不加过滤会触发解析报错。
内容的提问来源于stack exchange,提问作者lucasliu050
相关产品推荐
相关产品推荐

