栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Gson用多种对象类型反序列化JSON数组

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gson用多种对象类型反序列化JSON数组

这是我编写的一些代码,用于处理Json中的一系列NewsFeedArticle和NewsFeedAd项目。这两个项目都实现了标记接口NewsFeedItem,使我可以轻松地检查TypeAdater是否应用于特定字段。

public class NewsFeedItemTypeAdapterFactory implements TypeAdapterFactory {    @Override    @SuppressWarnings("unchecked")    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {        if (!NewsFeedItem.class.isAssignableFrom(type.getRawType())) { return null;        }        TypeAdapter<JsonElement> jsonElementAdapter = gson.getAdapter(JsonElement.class);        TypeAdapter<NewsFeedArticle> newsFeedArticleAdapter = gson.getDelegateAdapter(this, TypeToken.get(NewsFeedArticle.class));        TypeAdapter<NewsFeedAd> newsFeedAdAdapter = gson.getDelegateAdapter(this, TypeToken.get(NewsFeedAd.class));        return (TypeAdapter<T>) new NewsFeedItemTypeAdapter(jsonElementAdapter, newsFeedArticleAdapter, newsFeedAdAdapter).nullSafe();    }    private static class NewsFeedItemTypeAdapter extends TypeAdapter<NewsFeedItem> {        private final TypeAdapter<JsonElement> jsonElementAdapter;        private final TypeAdapter<NewsFeedArticle> newsFeedArticleAdapter;        private final TypeAdapter<NewsFeedAd> newsFeedAdAdapter;        NewsFeedItemTypeAdapter(TypeAdapter<JsonElement> jsonElementAdapter,     TypeAdapter<NewsFeedArticle> newsFeedArticleAdapter,     TypeAdapter<NewsFeedAd> newsFeedAdAdapter) { this.jsonElementAdapter = jsonElementAdapter; this.newsFeedArticleAdapter = newsFeedArticleAdapter; this.newsFeedAdAdapter = newsFeedAdAdapter;        }        @Override        public void write(JsonWriter out, NewsFeedItem value) throws IOException { if (value.getClass().isAssignableFrom(NewsFeedArticle.class)) {     newsFeedArticleAdapter.write(out, (NewsFeedArticle) value); } else if (value.getClass().isAssignableFrom(NewsFeedAd.class)) {     newsFeedAdAdapter.write(out, (NewsFeedAd) value); }        }        @Override        public NewsFeedItem read(JsonReader in) throws IOException { JsonObject objectJson = jsonElementAdapter.read(in).getAsJsonObject(); if (objectJson.has("Title")) {     return newsFeedArticleAdapter.fromJsonTree(objectJson); } else if (objectJson.has("CampaignName")) {     return newsFeedAdAdapter.fromJsonTree(objectJson); } return null;        }    }}

然后,您可以使用以下代码向Gson注册。

return new GsonBuilder()        .registerTypeAdapterFactory(new NewsFeedItemTypeAdapterFactory())        .create();


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号