Gson自定义反序列化器用于泛型类型

时间:2015-04-28 22:20:29

标签: java json generics gson deserialization

我有许多实现单一接口类型的类。我想编写一个自定义反序列化器,以便能够使用json处理一些特殊情况,我必须反序列化。这可能与谷歌gson?这是我到目前为止的示例代码:

班级类型:

public class MyClass implements MyInterface {
   .......
}

解串器

public class ResponseDeserializer implements JsonDeserializer<MyInterface>
{

    private Gson fGson;

    public ResponseDeserializer()
    {
        fGson = new Gson();
    }

    @Override
    public MyInterface deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
    {
        String jsonString = json.toString();

        if(jsonString.substring(0, 0).equals("["))
        {
            jsonString = "{ \"parameter\":" + jsonString + "}";
        }
        return context.deserialize(json, typeOfT);
    }   
}

从json方法注册并调用:

@Override
public <T extends MyInterface> T createResponse(Class<T> responseType)
{
    T returnObject = new GsonBuilder().registerTypeAdapter(MyInterface.class, new ResponseDeserializer())
            .create().fromJson(getEntityText(), responseType);
    return returnObject;
}

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

首先,registerTypeAdapter()不是covariant;如果要将TypeAdapter链接到界面,则必须使用TypeAdapterFactory。请参阅:How do I implement TypeAdapterFactory in Gson?

其次,为什么你认为[{...},{...},{...}]无效Json?当然是:

{  
   "foo":[  
      {  
         "type":"bar"
      },
      {  
         "type":"baz"
      }
   ]
}

这是一个对象数组foo的映射,带有一个成员变量。 Gson会自动使用以下POJO对其进行反序列化:

public class MyObject {
    List<TypedObject> foo;
}

public class TypedObject {
    String type;
}

除此之外,在不知道您的特定Json字符串的情况下,我无法帮助您。然而,这(特别是第一个链接)应该足以开始了。