Google Gson рассматривает каждый локальный файл JSON как строку, даже если его нет - PullRequest
0 голосов
/ 22 апреля 2019

Я постоянно получаю 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); 

Это также компилируется.

Моя проблема заключается в том, что я пытаюсь прочитать из локального файла, который я сам написал или загрузил из Интернета (я запустил все локальные файлы на JsonLint, и они действительны).

Вот JSON при записи в файл с именем testingArray.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, это работает. Но если я запускаю те же данные JSON из локального файла, это не сработает. Он всегда читается как строка, даже если он начинается с скобок.

1 Ответ

1 голос
/ 24 апреля 2019

Путь к файлу трактуется буквально как JSON полезная нагрузка, поэтому вы видите это исключение.Вам необходимо создать Reader на основе пути к файлу:

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