服务器返回的Json有一个元素,有时是一个空数组,有时是一个对象。 据我所知,我编写了自定义TypeAdapterFactory:
select nvl(nvl(column1,colume2),column3) from table;
但它仍然会抛出:@Override
public T read(final JsonReader in) throws IOException {
if (in.peek() == JsonToken.BEGIN_ARRAY) {
return null;
} else {
return delegateTypeAdapter.read(in);
}
}
这是我的时间表课程:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 652 path $.timetable
所以有时当时间表为空时,json看起来像这样:public final class Timetable implements Serializable{
private final Map<Integer, String> teachers;
private final Map<Integer, String> hours;
private final Map<Integer, String> rooms;
private final Map<Integer, String> groups;
private final Map<Integer, String> subjects;
private final Map<Integer, List<Map<String, String>>> entries;
}
如果它不是空的,就像这样:
"timetable": []
答案 0 :(得分:1)
我有一个类似于你的问题(当数组没有元素时我得到一个空字符串)所以我创建了一个通用的GsonArrayDeserializer,这个Ojbect的修改版本可以为你工作
public class GsonObjectDeserializer<T> implements JsonDeserializer<T> {
@Override
public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Gson gson = new Gson();
T result = null;
if (json.isJsonObject()) {
result = gson.fromJson(json.getAsJsonObject(), typeOfT);
}
}
}
并像这样使用
Gson gson = new GsonBuilder()
.registerTypeAdapter(Timetable.class , new GsonObjectDeserializer<Timetable>(Timetable.class))
.create();
EXTRA:
要将它与Retrofit2一起使用,请按此添加
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.URL_BASE)
...... //other paramaeters
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
很好地解释了here