#android #json #gson
#Android #json #gson
Вопрос:
это не дубликат, выслушайте меня
Я преобразую объект в json и сохраняю его в своей базе данных sqlite
db.execSQL("insert into favorites (obj) values ('" g.toJson(items.get(getAdapterPosition()),Hotel.class) "') ;");
когда я извлекаю его из базы данных и преобразую обратно в объект с помощью gson.из json я получаю эту ошибку
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path
но я не использую здесь никаких массивов, я просто имею дело с одним объектом за раз, я решил записать json в logcat перед сохранением и после его извлечения, и вот что я получаю
перед сохранением совершенно прекрасный объект, каким я его задумал
D/JSON: {"id":"IQPARAUB","location":"PARIS - 33 RUE DAUPHINE","name":"HOTEL D AUBUSSON","price":"540.0EUR"}
после его извлечения я получил это:
D/JSON: [B@1d9cd22
вы видите, что [ в начале объекта, это то, что вызывает ошибку, Gson понимает, что это массив из-за [ в начале..
как я могу это исправить?
Ответ №1:
Когда вы добавляете объект в базу данных в то время, это object (raw для базы данных), но когда вы извлекаете с select *
условием в то время, он возвращает список строк (список объекта, даже если есть только 1 запись). Вот почему он выдает ошибку but was BEGIN_ARRAY
.
Поэтому вы должны получить в списке следующим образом:
Type hotelListType = new TypeToken<ArrayList<Hotel>>(){}.getType();
ArrayList<Hotel> hotelArray = gson.fromJson(hotelJson, hotelListType );
Комментарии:
1. я получил это после применения вашего решения «Ожидаемый BEGIN_OBJECT, но был STRING в строке 1 столбец 2 путь $ [0]»
Ответ №2:
Я просто добавил [] до и после моего объекта JSON в инструкции exec sql воспользовался советом комментария выше, и это работает .. на данный момент код стал таким:
db.execSQL("insert into favorites (obj) values ('[" g.toJson(items.get(getAdapterPosition()),Hotel.class).toString() "]') ;");
//and when retrieved:
Gson gson = new Gson();
Type hotelListType = new TypeToken<ArrayList<Hotel>>(){}.getType();
ArrayList<Hotel> h = gson.fromJson(json, hotelListType );
это работает