Gson Streaming API解析Json数组无法读取全部JsonObject迭代项报错求助
GSON Streaming API数组解析报错修复方案
核心报错根因
Expected name but was BEGIN_OBJECT报错本质是GSON流式解析的指针位置异常:
- 解析完第一个数组元素对象后,没有执行
endObject()方法消耗掉当前对象的结束标记 - 或是数组循环逻辑错误,没有正确判断数组结束标记
END_ARRAY的位置
导致GSON认为还在第一个对象的内部解析属性,把第二个对象的起始标记BEGIN_OBJECT当成了属性名来读取,直接抛出类型不匹配异常。
正确实现步骤
1. 对应JSON结构参考
{ "Report_Entry": [ {"key1": "val1", "key2": "val2", "key3": "val3", "key4": "val4", "key5": "val5"}, {"key1": "val11", "key2": "val22", "key3": "val33", "key4": "val44", "key5": "val55"} ] }
2. 修复后的流式解析代码示例
import com.google.gson.stream.JsonReader; import java.io.InputStreamReader; import java.io.IOException; public void parseLargeJson(InputStream inputStream) throws IOException { JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8")); try { // 解析根对象 reader.beginObject(); while (reader.hasNext()) { String rootKey = reader.nextName(); if (rootKey.equals("Report_Entry")) { // 匹配数组字段,启动数组解析 reader.beginArray(); while (reader.hasNext()) { // 解析单个数组元素对象 reader.beginObject(); String key1 = null, key2 = null, key3 = null, key4 = null, key5 = null; while (reader.hasNext()) { String objKey = reader.nextName(); switch (objKey) { case "key1": key1 = reader.nextString(); break; case "key2": key2 = reader.nextString(); break; case "key3": key3 = reader.nextString(); break; case "key4": key4 = reader.nextString(); break; case "key5": key5 = reader.nextString(); break; default: // 跳过无用字段,避免指针偏移 reader.skipValue(); break; } } // *【关键缺失逻辑】* 必须调用endObject闭合当前对象,指针才会移动到下一个数组元素位置 reader.endObject(); // 此处可自定义处理解析完成的单条数据 System.out.printf("解析完成:key1=%s, key2=%s%n", key1, key2); } // 闭合数组 reader.endArray(); } else { // 跳过根节点下其他无用字段 reader.skipValue(); } } // 闭合根对象 reader.endObject(); } finally { reader.close(); } }
其他排查点
如果修改后仍报错,可按以下顺序检查:
- 所有
beginObject()都有对应的endObject(),所有beginArray()都有对应的endArray(),嵌套顺序不能错乱 - 解析属性时遇到未知字段必须调用
skipValue()消耗值,不能直接中断循环 - 不要在数组元素解析循环中提前break,除非手动跳过当前对象所有剩余属性并执行了
endObject()
内容的提问来源于stack exchange,提问作者Kunal
相关产品推荐
相关产品推荐

