gson.fromJson 预期 BEGIN_OBJECT 但由于对象的存储方式 BEGIN_ARRAY

gson.fromJson Expected BEGIN_OBJECT but was BEGIN_ARRAY because of how the object is stored

这不是重复的,听我说完

我正在将对象转换为 json 并将其存储在我的 sqlite 数据库中

db.execSQL("insert into favorites (obj) values ('"+g.toJson(items.get(getAdapterPosition()),Hotel.class)+"') ;");

当我从数据库中检索它并使用 gson.from 将其转换回对象时 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 理解这是一个数组,因为开头的 [..

我该如何解决这个问题?

当你在数据库中添加对象时,它是对象(数据库的原始对象),但是当你当时使用 select * 条件检索时,它是 returns 行列表(对象列表,即使只有 1 条记录)。这就是为什么它给出 but was BEGIN_ARRAY.

错误的原因

因此您必须像这样在列表中检索:

Type hotelListType = new TypeToken<ArrayList<Hotel>>(){}.getType();
ArrayList<Hotel> hotelArray = gson.fromJson(hotelJson, hotelListType );  

我刚刚在 exec sql 语句中的 JSON 对象之前和之后添加了 [ ] + 采纳了上面评论的建议并且现在有效.. 代码变成了:

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

这有效