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 );
这有效
这不是重复的,听我说完
我正在将对象转换为 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 );
这有效