我有许多实现单一接口类型的类。我想编写一个自定义反序列化器,以便能够使用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;
}
感谢您的帮助
答案 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字符串的情况下,我无法帮助您。然而,这(特别是第一个链接)应该足以开始了。