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

使用GSON的JsonReader读取JSON文件时hasNext()报错且无限循环问题

GSON JsonReader代码问题分析
  • 未正确匹配JSON结构进入对应层级:JsonReader是严格的流式JSON解析工具,读取前必须先匹配JSON的顶层结构,如果顶层是JSON对象需要先调用beginObject(),如果是JSON数组需要调用beginArray(),否则直接调用nextName()会因为当前流位置不是键名,抛出结构不匹配异常,你遇到的InvocationTargetException是外层包装异常,根因就是JSON结构读取顺序错误。
  • 流指针没有正确推进:nextName()仅读取当前层级的键名,读取完成后必须调用对应类型的取值方法(比如nextString()/nextInt()/beginObject()等)读取键对应的值,否则流的读取指针不会向后移动,hasNext()会一直返回true,导致死循环。
  • 对hasNext()的作用理解错误:hasNext()仅判断当前所处的JSON对象/数组层级是否还有未读取的元素,不是判断整个JSON文件是否读取完毕,只有当前层级所有元素读取完成调用endObject()/endArray()后,当前层级的hasNext()才会返回false。

正确示例代码

假设你的phrases.json顶层是普通键值对对象,正确写法如下:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import com.google.gson.stream.JsonReader;

// 你的业务代码块
File jsonInputFile = new File(root + "/dicts/phrases.json");
// 用try-with-resources自动关闭流,避免资源泄漏
try (JsonReader reader = new JsonReader(new FileReader(jsonInputFile, StandardCharsets.UTF_8))) {
    // 进入顶层JSON对象
    reader.beginObject();
    while (reader.hasNext()) {
        String key = reader.nextName();
        // 读取键对应的值,根据实际值类型调整调用的方法
        String value = reader.nextString();
        System.out.println(key);
    }
    // 退出顶层JSON对象
    reader.endObject();
} catch (IOException e) {
    e.printStackTrace();
}

如果你的JSON顶层是数组,将beginObject()改为beginArray(),循环内处理数组元素即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:57:00