Google Gson 将每个 JSON 本地文件视为一个字符串,即使它不是
Google Gson treats every JSON local file as a string even when its not
我经常收到 Expected BEGIN_TYPE but was STRING at line 1 column 1 path $
错误。我已阅读有关该错误的信息,但我遇到了不同的情况。
当我尝试对我在我的应用程序中创建的 JSON
字符串使用 gson.fromJson()
时,它编译正常。
ArrayList<MyCar> cars = new ArrayList<>();
cars.add(new MyCar());
cars.add(new MyCar());
String json = gson.toJson(cars);
这编译。
Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
ArrayList<MyCar> myCars = gson.fromJson(json, carList);
这也编译。
我的问题是,当我尝试读取自己编写或从网络下载的本地文件时(我在 JsonLint
上有 运行 所有本地文件,它们都是有效的).
这是写入名为 testingArray.json
的文件时的 JSON:
[{
"model": "I3",
"manufacturer": "Audi",
"features": ["wifi", "bluetooth", "charging"]
}, {
"model": "I3",
"manufacturer": "Audi",
"features": ["wifi", "bluetooth", "charging"]
}, {
"model": "I3",
"manufacturer": "Audi",
"features": ["wifi", "bluetooth", "charging"]
}]
它显然以括号而不是引号开头。
但是这个:
Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
ArrayList<MyCar> myCars = gson.fromJson(basePath + "testingArray.json", carList);
无法编译并出现上述错误。
我很困惑为什么,因为当我 运行 fromJson
在像 JSON
这样的 POJO
上时它起作用了。但是,如果我 运行 来自本地文件的相同 JSON 数据,它就不起作用。它始终将其读取为字符串,即使它以括号开头也是如此。
文件路径按字面意思被视为 JSON
负载,所以这就是您看到此异常的原因。您需要根据文件路径创建 Reader
:
try (FileReader jsonReader = new FileReader(basePath + "testingArray.json")) {
Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
List<MyCar> myCars = gson.fromJson(jsonReader, carList);
}
我经常收到 Expected BEGIN_TYPE but was STRING at line 1 column 1 path $
错误。我已阅读有关该错误的信息,但我遇到了不同的情况。
当我尝试对我在我的应用程序中创建的 JSON
字符串使用 gson.fromJson()
时,它编译正常。
ArrayList<MyCar> cars = new ArrayList<>();
cars.add(new MyCar());
cars.add(new MyCar());
String json = gson.toJson(cars);
这编译。
Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
ArrayList<MyCar> myCars = gson.fromJson(json, carList);
这也编译。
我的问题是,当我尝试读取自己编写或从网络下载的本地文件时(我在 JsonLint
上有 运行 所有本地文件,它们都是有效的).
这是写入名为 testingArray.json
的文件时的 JSON:
[{
"model": "I3",
"manufacturer": "Audi",
"features": ["wifi", "bluetooth", "charging"]
}, {
"model": "I3",
"manufacturer": "Audi",
"features": ["wifi", "bluetooth", "charging"]
}, {
"model": "I3",
"manufacturer": "Audi",
"features": ["wifi", "bluetooth", "charging"]
}]
它显然以括号而不是引号开头。
但是这个:
Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
ArrayList<MyCar> myCars = gson.fromJson(basePath + "testingArray.json", carList);
无法编译并出现上述错误。
我很困惑为什么,因为当我 运行 fromJson
在像 JSON
这样的 POJO
上时它起作用了。但是,如果我 运行 来自本地文件的相同 JSON 数据,它就不起作用。它始终将其读取为字符串,即使它以括号开头也是如此。
文件路径按字面意思被视为 JSON
负载,所以这就是您看到此异常的原因。您需要根据文件路径创建 Reader
:
try (FileReader jsonReader = new FileReader(basePath + "testingArray.json")) {
Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
List<MyCar> myCars = gson.fromJson(jsonReader, carList);
}