反序列化与杰克逊泛型类型(Deserializing a Generic Type with Jac

2019-07-03 10:37发布

我试图让使用杰克逊反序列化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个问题。

第一个是我传递类的类型为方法,使得objectmapper知道应该反序列化的类型。 是否有使用泛型更好的办法?

另外,在get方法我投对象从到T.这似乎这样做,因为我要在这里投T和那么我也从中调用它的方法投的对象类型的特别讨厌的方式objectMapper返回。

我在这个项目中使用Roboguice所以这将是很好,如果我可以通过注射改变类型,然后标注通用型我需要它返回的对象。 我读到TypeLiteral ,不知道它是否能解决这个问题?

Answer 1:

第一个是我传递类的类型为方法,使得objectmapper知道应该反序列化的类型。 是否有使用泛型更好的办法?

不幸的是没有了,这是因为类型擦除。

另外,在get方法我投对象从到T.这似乎这样做,因为我要在这里投T和那么我也从中调用它的方法投的对象类型的特别讨厌的方式objectMapper返回。

做到这一点,而不是:

@Override
public T get(String content, Class<T> clazz) throws IOException {
    return objectMapper.readValue(content, clazz);
}

我在这个项目中使用Roboguice所以这将是很好,如果我可以通过注射改变类型,然后标注通用型我需要它返回的对象。 我读到TypeLiteral,不知道它是否能解决这个问题?

我真的不明白你想达到什么,但因为你需要通过反正类,是仍然有可能?



Answer 2:

所以我想我理解了它的尽头。 如果你看到什么毛病我在做什么,请发表评论。

该接口的定义是这样的...

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对象使用

此文章帮助我



文章来源: Deserializing a Generic Type with Jackson