在不同时间反序列化可以是Array或Object的json元素

时间:2017-06-20 07:27:13

标签: android json

服务器返回的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": []

1 个答案:

答案 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