gson.FromJSON ожидал BEGIN_OBJECT, но был BEGIN_ARRAY из-за того, как хранится объект

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

  

это работает