在不同时间反序列化可以是数组或对象的 json 元素.服务器返回的



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

这里解释得很好

最新更新