用Jackson反序列化泛型类型

我正在尝试制作一个使用Jackson来反序列化POJO的类。

看起来像这样…

public class DeserialiserImp<T> implements Deserialiser<T> {

protected ObjectMapper objectMapper = new ObjectMapper();

@Override

public T get(String content, Class clazz) throws IOException {

return (T) objectMapper.readValue(content, clazz);

}

@Override

public List<T> getList(String content, Class clazz) throws IOException {

return objectMapper.readValue(content, TypeFactory.collectionType(ArrayList.class, clazz));

}

}

我对此实施有2个问题。

首先是我将类类型传递给方法,以便对象映射器知道应反序列化的类型。有使用泛型的更好方法吗?

同样在get方法中,我将一个从objectMapper返回的对象强制转换为T。这看起来特别讨厌,因为我必须在此处强制转换T,然后还必须从调用它的方法中强制转换对象类型。

我在该项目中使用了Roboguice,因此如果可以通过注入来更改类型,然后对对象进行注释,则该对象将是我需要它返回的泛型类型。我读了有关TypeLiteral的文章,想知道它是否可以解决此问题?

回答:

所以我想我最终想通了。如果您发现我的工作有问题,请发表评论。

接口的定义如下:

public interface Deserialiser<T> {

T get(String content) throws IOException;

List<T> getList(String content) throws IOException;

}

接口的实现是这样的…

public class DeserialiserImp<T> implements Deserialiser<T> {

private ObjectMapper objectMapper = new ObjectMapper();

private final Class<T> klass;

@Inject

public DeserialiserImp(TypeLiteral<T> type){

this.klass = (Class<T>) type.getRawType();

}

@Override

public T get(String content) throws IOException {

return objectMapper.readValue(content, klass);

}

@Override

public List<T> getList(String content) throws IOException {

return objectMapper.readValue(content, TypeFactory.collectionType(ArrayList.class, klass));

}

}

我像这样绑定2

    bind(new TypeLiteral<Deserialiser<User>>(){}).annotatedWith(Names.named("user")).to(new TypeLiteral<DeserialiserImp<User>>(){});

然后,我要做的就是使用它…

@Inject

@Named("user")

private Deserialiser<User> deserialiserImp;

public void test(String userString) {

User user = deserialiserImp.get(UserString);

}

如果该类作为要在DAO对象中使用的抽象类,则此模式也可以很好地工作

这篇文章对我有帮助

以上是 用Jackson反序列化泛型类型 的全部内容, 来源链接: utcz.com/qa/404963.html

回到顶部