首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用改进的GSON获得嵌套的JSON对象

使用改进的GSON获得嵌套的JSON对象
EN

Stack Overflow用户
提问于 2014-04-15 04:59:29
回答 10查看 103K关注 0票数 114

我正在使用我的android应用程序的API,所有JSON响应都是这样的:

代码语言:javascript
复制
{
    'status': 'OK',
    'reason': 'Everything was fine',
    'content': {
         < some data here >
}

问题是我所有的POJO都有一个statusreason字段,在content字段中是我想要的真正的POJO。

有没有办法创建一个自定义的Gson转换器来提取始终的content字段,以便retrofit返回适当的POJO?

EN

回答 10

Stack Overflow用户

发布于 2016-11-19 18:24:17

有点晚了,但希望这能帮助一些人。

只需创建以下TypeAdapterFactory即可。

代码语言:javascript
复制
    public class ItemTypeAdapterFactory implements TypeAdapterFactory {

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

            public void write(JsonWriter out, T value) throws IOException {
                delegate.write(out, value);
            }

            public T read(JsonReader in) throws IOException {

                JsonElement jsonElement = elementAdapter.read(in);
                if (jsonElement.isJsonObject()) {
                    JsonObject jsonObject = jsonElement.getAsJsonObject();
                    if (jsonObject.has("content")) {
                        jsonElement = jsonObject.get("content");
                    }
                }

                return delegate.fromJsonTree(jsonElement);
            }
        }.nullSafe();
    }
}

并将其添加到GSON构建器中:

代码语言:javascript
复制
.registerTypeAdapterFactory(new ItemTypeAdapterFactory());

代码语言:javascript
复制
 yourGsonBuilder.registerTypeAdapterFactory(new ItemTypeAdapterFactory());
票数 10
EN

Stack Overflow用户

发布于 2014-12-16 05:13:49

延续Brian的想法,因为我们几乎总是有许多REST资源,每个REST资源都有自己的根,所以推广反序列化可能会很有用:

代码语言:javascript
复制
 class RestDeserializer<T> implements JsonDeserializer<T> {

    private Class<T> mClass;
    private String mKey;

    public RestDeserializer(Class<T> targetClass, String key) {
        mClass = targetClass;
        mKey = key;
    }

    @Override
    public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
            throws JsonParseException {
        JsonElement content = je.getAsJsonObject().get(mKey);
        return new Gson().fromJson(content, mClass);

    }
}

然后,为了解析上面的样本有效负载,我们可以注册GSON反序列化器:

代码语言:javascript
复制
Gson gson = new GsonBuilder()
    .registerTypeAdapter(Content.class, new RestDeserializer<>(Content.class, "content"))
    .build();
票数 6
EN

Stack Overflow用户

发布于 2016-10-26 13:02:53

更好的解决方案可能是这样的..

代码语言:javascript
复制
public class ApiResponse<T> {
    public T data;
    public String status;
    public String reason;
}

然后,像这样定义您的服务。

代码语言:javascript
复制
Observable<ApiResponse<YourClass>> updateDevice(..);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23070298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档