使用Java/GSON解析MusicBrainz无括号无逗号分隔的大JSON报错如何解决
问题原因
你要解析的是拼接式JSON格式(又称NDJSON/JSON Lines),文件由多个独立JSON对象直接拼接组成,无外层数组括号、对象间无逗号分隔。你的代码调用了jsonReader.beginArray()要求解析数组起始符[,但文件首个有效字符是对象起始符{,因此触发类型不匹配异常。
适配方案
直接使用Gson原生流式解析的宽松模式即可完美适配,无需提前修改源文件,全程流式处理内存占用极低,适配10GB级大文件场景。
修改后代码
try(JsonReader jsonReader = new JsonReader( new InputStreamReader( new FileInputStream(jsonFilePath), StandardCharsets.UTF_8))) { Gson gson = new GsonBuilder().create(); // 开启宽松解析模式,支持多JSON对象拼接的非标准格式 jsonReader.setLenient(true); // 直接循环读取每个独立的Artist对象,无需数组操作 while (jsonReader.hasNext()) { Artist mapped = gson.fromJson(jsonReader, Artist.class); // 此处编写你的业务处理逻辑 } } catch (IOException e) { e.printStackTrace(); }
核心修改说明
- 移除
jsonReader.beginArray()、jsonReader.endArray()调用:源文件无数组结构,不需要做数组校验。 - 添加
jsonReader.setLenient(true):关闭严格JSON校验,允许Gson在读取完一个JSON对象后继续读取后续的其他对象,不会提前抛出EOF异常。
其他注意事项
不建议自行按行分割JSON对象再解析,因为单个JSON对象可能跨多行,自行分割容易出现结构错误,Gson原生流式解析会自动处理JSON结构识别,可靠性更高。
内容的提问来源于stack exchange,提问作者Dimitri Petrucci
相关产品推荐
相关产品推荐

