java 如何将 Jackson 的 TypeReference 与泛型一起使用?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/34578452/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 23:04:43  来源:igfitidea点击:

How to use Hymanson's TypeReference with generics?

javajsongenericsHymansonmapping

提问by Mark Korzhov

For json mapping I use the following method:

对于 json 映射,我使用以下方法:

public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() {
    });
}

And UserDtolooks like this:

UserDto看起来是这样的:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDto {

    @JsonProperty("items")
    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
}

I want to improve this method of mapping without being attached to a UserDtoclass, and replacing it with a generic.

我想在不附加到UserDto类的情况下改进这种映射方法,并将其替换为泛型。

Is it possible? And How?

是否可以?如何?

Thanks.

谢谢。

回答by StaxMan

TypeReferencerequires you to specify parameters statically, not dynamically, so it does not work if you need to further parameterize types.

TypeReference要求您静态地而不是动态地指定参数,因此如果您需要进一步参数化类型,它不起作用。

What I think you need is JavaType: you can build instances dynamically by using TypeFactory. You get an instance of TypeFactoryvia ObjectMapper.getTypeFactory(). You can also construct JavaTypeinstances from simple Classas well as TypeReference.

我认为您需要的是JavaType:您可以使用TypeFactory. 你得到一个TypeFactoryvia的实例ObjectMapper.getTypeFactory()。您还可以JavaType从 simpleClassTypeReference.

回答by Marcel Baumann

One approach will be to define a Hymanson JavaTyperepresenting a list of items of type clazz. You still need to have access to the class of the generic parameter at runtime. The usual approach is something like

一种方法是定义一个 Hymanson JavaType,表示clazz类型的项目列表。您仍然需要在运行时访问泛型参数的类。通常的方法是这样的

<T> class XX { XX(Class<T> clazz, ...) ... } 

to pass the class of the generic parameter into the generic class at construction.

在构造时将泛型参数的类传递到泛型类中。

Upon access to the Class clazzvariable you can construct a Hymanson JavaType representing, for example, a list of items of class clazzwith the following statement.

在访问 Class clazz变量时,您可以构造一个 Hymanson JavaType 表示,例如,使用以下语句表示类clazz的项目列表。

JavaType itemType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);

I hope it helped. I am using this approach in my own code.

我希望它有所帮助。我在自己的代码中使用这种方法。