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

如何基于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();
}

为什么这些方案更优?

  1. IO效率提升:按行读取或一次性读取,减少了底层IO的调用次数,远快于逐字符读取;
  2. 内存更高效:用StringBuilder代替j = j + s的字符串拼接,避免了频繁创建新的String对象;
  3. 避免错误:依赖Gson的内置JSON解析逻辑,不会因为字符串字段中包含的大括号导致计数错误(比如JSON里的"desc": "这是{示例}文本",你的原代码会误判括号数量);
  4. 代码更简洁:省去了手动计数括号的复杂逻辑,可读性和可维护性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:13:11