【发布时间】:2021-09-21 21:25:42
【问题描述】:
我正在尝试使用 Java 和 GSON 解析来自 Musicbrainz.org 的 JSON 格式的大型(约 10GB)数据库转储
JSON 文件具有这种结构。没有'['']'表示这将是一个对象数组,每个对象之间没有','。不知道为什么,这个JSON文件就是这样的。
{
"id": "d0ab06e1-751a-414b-a976-da72670391b1",
"name": "Arcing Wires",
"sort-name": "Arcing Wires"
}
{
"id": "6f0c2c16-dd7e-4268-a484-bc7b2ac78108",
"name": "Another",
"sort-name": "Another"
}
{
"id": "e062b6cd-5506-47b0-afdb-72f4279ec38c",
"name": "Agent S",
"sort-name": "Agent S"
}
这是我正在使用的代码:
try(JsonReader jsonReader = new JsonReader(
new InputStreamReader(
new FileInputStream(jsonFilePath), StandardCharsets.UTF_8))) {
Gson gson = new GsonBuilder().create();
jsonReader.beginArray();
while (jsonReader.hasNext()) {
Artist mapped = gson.fromJson(jsonReader, Artist.class);
//TODO do something with the object
}
}
jsonReader.endArray();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我映射的类是这样的:
public class Artist {
@SerializedName("id")
public String id;
@SerializedName("name")
public String name;
@SerializedName("sort-name")
public String sortName;
}
我得到的错误:
Exception in thread "main" java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
at DBLoader.parse(DBLoader.java:39)
at DBLoader.main(DBLoader.java:23)
我相信 GSON 期望的结构与我声明的结构不同,但我不明白我应该如何定义这种没有逗号和方括号的 JSON。 有什么线索吗? 谢谢
【问题讨论】:
-
这不是 JSON,它是一堆单独的 JSON 对象,它们被塞进一个文件中。要求 JSON 解析器读取它会失败。就像让会说英语和西班牙语的朋友为您翻译俄语一样。您有几个选择:预处理流并通过插入缺少的语法将其转换为合法的 JSON。或者,分别处理每个有效块(
{...}之间的单个 JSON 对象)。您真的需要将整个内容加载到内存中吗? -
对不起,但信息非常清楚。您命令解析器读取数组,但没有数组,解析器正在给您确切的问题。