具有Retrofit转换器的Gson解串器:只需要内部JSON来处理所有响应 [英] Gson deserializer with Retrofit converter: just need inner JSON for all responses

查看:144
本文介绍了具有Retrofit转换器的Gson解串器:只需要内部JSON来处理所有响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  {
stuff_i_need:[
{
title:你好
},
{
title:世界!


$ status

$ b $


  {
other_things_key:
{
版本:208
},
status:success
}

总是有两个元素,我只需要那个不是状态的元素。
我想用一个GsonBuilder来做这件事。



我试过了:

<$ p $新的GsonBuilder()
.registerTypeAdapter(List.class,new JsonDeserializer< List>(){
@Override
public List反序列化(JsonElement json ,类型typeOfT,
JsonDeserializationContext上下文)
throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
for(Map.Entry< String,JsonElement> entry:jsonObject。 entrySet()){
final JsonElement element = entry.getValue();
if(element.isJsonArray()){
返回新的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);

返回新的TypeAdapter< T>(){
@Override
public void write(JsonWriter out,T value)抛出IOException {
delegate.write(out,值);
}

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


$ / code $ / pre

这是在RestAdapter.Builder上设置的: / b>

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

我真的只是删除了statusJsonObject。


I am working with an API that always responds like so:

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

and

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

There are always two elements, and I just need the one that is not "status." I want to do this with one GsonBuilder, as well.

I tried:

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

but I don't think that is right, and it doens't satisfy the broader conditions.

解决方案

With some help from Gowtham, I ended up doing the following:

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

and this is set on the RestAdapter.Builder:

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

I really just ended up removing the "status" JsonObject.

这篇关于具有Retrofit转换器的Gson解串器:只需要内部JSON来处理所有响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆