使用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
相关产品推荐
相关产品推荐

