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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:18:05