Json有一个元素,有时是空数组,有时是对象。据我所知,我编写了自定义TypeAdapterFactory:
@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
这是我的时间表课程:
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;
}
所以有时当时间表为空时,json 看起来像这样:"timetable": []
当它不为空时,它是这样的:
"timetable": {
"teachers": {
"762": "sfsdfsdf",
},
"hours": {
"1": "09:00",
},
"rooms": {
"439": "sdfsdfsdf",
},
"subjects": {
"738": "sdfsdfdsf",
},
"entries": {
"10": [
{
"week": "1",
"day": "6",
"date": "2017-03-01",
"hour": "1",
"type": "0",
"course": "3844",
"teacher": "59502",
"room": "640",
"p": "-1",
"table": "1447"
},
{
"week": "1",
"day": "6",
"date": "2017-03-01",
"hour": "2",
"type": "0",
"course": "4047",
"teacher": "50792",
"room": "799",
"p": "-1",
"table": "1447"
}
]
}
我遇到了一个类似于你的问题(当数组没有元素时,我得到一个空字符串(,所以我创建了一个通用的 GsonArrayDeserializer,这个修改后的版本为你准备了一个 Ojbect sould 工作
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();
额外:
要将其与 Retrofit2 一起使用,请像这样添加它
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.URL_BASE)
...... //other paramaeters
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
这里解释得很好