如何基于Gson库高效从文件中读取单个JSON字符串?
优化Gson读取单个JSON字符串的效率问题
你的问题很典型——手动逐字符读取并拼接字符串确实会导致IO效率低下和内存浪费,而且还容易因为JSON内容中包含的大括号(比如字符串字段里的{})导致计数错误。下面给你几个更优的解决方案:
一、如果文件中是单个完整的JSON对象
直接一次性读取整个文件内容,再用Gson解析,这是最简单高效的方式:
方案1:用BufferedReader + StringBuilder读取
File file = new File(getContext().getFilesDir(), "slovicka.json"); try (BufferedReader br = new BufferedReader(new FileReader(file))) { StringBuilder jsonBuilder = new StringBuilder(); String line; // 按行读取,减少IO调用次数 while ((line = br.readLine()) != null) { jsonBuilder.append(line); } String fullJson = jsonBuilder.toString(); // 解析JSON Gson gson = new Gson(); SlovickoS slovos = gson.fromJson(fullJson, SlovickoS.class); list.add(slovos); // 注意原代码里的`slovo`应该是笔误,改成`slovos` } catch (Exception e) { System.out.println("Chyba při čtení ze souboru: " + e.getMessage()); e.printStackTrace(); }
方案2:Java 8+ 用Files.readString简化代码
如果你的项目使用Java 8及以上版本,可以用更简洁的API直接读取文件内容:
File file = new File(getContext().getFilesDir(), "slovicka.json"); try { // 一次性读取整个文件到字符串 String fullJson = Files.readString(file.toPath()); Gson gson = new Gson(); SlovickoS slovos = gson.fromJson(fullJson, SlovickoS.class); list.add(slovos); } catch (Exception e) { System.out.println("Chyba při čtení ze souboru: " + e.getMessage()); e.printStackTrace(); }
二、如果文件中包含多个JSON对象(流式读取)
如果你的文件里是连续的多个JSON对象(比如没有用数组包裹),可以用Gson的JsonReader流式读取,不需要加载整个文件到内存,适合大文件场景:
File file = new File(getContext().getFilesDir(), "slovicka.json"); try (JsonReader reader = new JsonReader(new FileReader(file))) { Gson gson = new Gson(); // 循环读取每个JSON对象,直到文件结束 while (reader.peek() != JsonToken.END_DOCUMENT) { SlovickoS slovos = gson.fromJson(reader, SlovickoS.class); list.add(slovos); } } catch (Exception e) { System.out.println("Chyba při čtení ze souboru: " + e.getMessage()); e.printStackTrace(); }
为什么这些方案更优?
- IO效率提升:按行读取或一次性读取,减少了底层IO的调用次数,远快于逐字符读取;
- 内存更高效:用
StringBuilder代替j = j + s的字符串拼接,避免了频繁创建新的String对象; - 避免错误:依赖Gson的内置JSON解析逻辑,不会因为字符串字段中包含的大括号导致计数错误(比如JSON里的
"desc": "这是{示例}文本",你的原代码会误判括号数量); - 代码更简洁:省去了手动计数括号的复杂逻辑,可读性和可维护性更好。
内容的提问来源于stack exchange,提问作者BIBI
相关产品推荐
相关产品推荐

