Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 带有Retrofit转换器的Gson反序列化器:只需要内部JSON用于所有响应大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用一个总是如此响应的API:

{
"stuff_i_need": [
    {
        "title": "Hello"
    },{
        "title": "World!"
    }
],"status": "success"
}

{
"other_things_key":
    {
        "version": "208"
    },"status": "success"
}

总有两个元素,我只需要一个不是“状态”的元素.
我想用一个GsonBuilder来做这个.

我试过了

new GsonConverter(new GsonBuilder()
    .registerTypeAdapter(List.class,new JsonDeserializer<List>() {
        @Override
        public List deserialize(JsonElement json,Type typeOfT,JsonDeserializationContext context)
        throws JsonParseException {
            final JsonObject jsonObject = json.getAsJsonObject();
            for (Map.Entry<String,JsonElement> entry : jsonObject.entrySet()) {
                final JsonElement element = entry.getValue();
                if (element.isJsonArray()) {
                    return new Gson().fromJson(element.getAsJsonArray(),new TypeToken<List>(){}.getType());
                }
            }
            return null;
        }
    )

但我不认为这是对的,它不能满足更广泛的条件.

解决方法

在Gowtham的帮助下,我最终做了以下事情:

private static class ItemTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(Gson gson,final TypeToken<T> typE) {

        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this,typE);
        final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);

        return new TypeAdapter<T>() {
            @Override
            public void write(JsonWriter out,T value) throws IOException {
                delegate.write(out,value);
            }

            @Override
            public T read(JsonReader in) throws IOException {
                JsonElement jsonElement = elementAdapter.read(in);
                if (jsonElement.isJsonObject()) {
                    JsonObject jsonObject = jsonElement.getAsJsonObject();
                    if (jsonObject.entrySet().size() == 2) {
                        jsonObject.remove("status");
                        jsonElement = jsonObject.entrySet().iterator().next().getValue();
                    }
                }
                return delegate.fromJsonTree(jsonElement);
            }
        }.nullSafe();
    }
}

这是在RestAdapter.builder上设置的:

.setConverter(new GsonConverter(new GsonBuilder()
                .registerTypeAdapterFactory(new ItemTypeAdapterFactory())
                .create()))

我真的刚刚删除了“状态”JsonObject.

大佬总结

以上是大佬教程为你收集整理的android – 带有Retrofit转换器的Gson反序列化器:只需要内部JSON用于所有响应全部内容,希望文章能够帮你解决android – 带有Retrofit转换器的Gson反序列化器:只需要内部JSON用于所有响应所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。