Google Gson会将每个JSON本地文件都视为字符串,即使不是

时间:2019-04-22 08:56:57

标签: java json io gson json-deserialization

我经常遇到Expected BEGIN_TYPE but was STRING at line 1 column 1 path $错误。我已经读过有关该错误的信息,但是遇到了一些不同的事情。

当我尝试在我的应用中创建的gson.fromJson()字符串上使用JSON时,它可以很好地编译。

     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); 

这也可以编译。

我的问题是,当我尝试读取自己写的本地文件或从Web下载的本地文件时(我已经在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这样的POJO上运行JSON时,它可以工作。但是,如果我从本地文件运行SAME JSON数据,它将无法正常工作。即使它以方括号开头,它也始终将其读取为字符串。

1 个答案:

答案 0 :(得分:1)

文件路径实际上被视为JSON有效负载,因此这就是您看到此异常的原因。您需要根据文件路径创建Reader

try (FileReader jsonReader = new FileReader(basePath + "testingArray.json")) {
    Type carList = new TypeToken<ArrayList<MyCar>>(){}.getType();
    List<MyCar> myCars = gson.fromJson(jsonReader, carList); 
}