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

cigdeys3  于 2022-11-08  发布在  其他
关注(0)|答案(4)|浏览(180)

对于jsonMap,我使用以下方法:

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

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;
    }
}

我想改进这种Map方法,而不附加到UserDto类,并将其替换为泛型。
这可能吗?怎么可能?

  • 谢谢-谢谢
6l7fqoea

6l7fqoea1#

TypeReference要求您静态地而不是动态地指定参数,因此如果您需要进一步参数化类型,它将不起作用。
我认为你需要的是JavaType:您可以使用TypeFactory动态构建示例。您可以通过ObjectMapper.getTypeFactory()获得TypeFactory的示例。您还可以从简单的ClassTypeReference构建JavaType示例。

6qqygrtg

6qqygrtg2#

一种方法是定义一个JacksonJavaType,表示一个 clazz 类型的项列表。

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

以在建构时将泛型参数的类别传递至泛型类别。
在访问Class clazz 变量时,您可以使用以下语句构造一个JacksonJavaType,例如,它表示class clazz 的项列表。

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

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

ubbxdtey

ubbxdtey3#

试试看:

import com.fasterxml.jackson.databind.ObjectMapper;
    import java.lang.reflect.Array;
    import java.util.Arrays;

    ...        

    public static <TargetType> List<TargetType> convertToList(String jsonString, Class<TargetType> targetTypeClass) {
        List<TargetType> listOfTargetObjects = null;
        ObjectMapper objectMapper = new ObjectMapper();
        TargetType[] arrayOfTargetType = (TargetType[]) Array.newInstance(targetTypeClass, 0);

        try {
            listOfTargetObjects = (List<TargetType>) Arrays.asList(objectMapper.readValue(jsonString, arrayOfTargetType.getClass()));
        } catch (JsonMappingException jsonMappingException) {
            listOfTargetObjects = null;
        } catch (JsonProcessingException jsonProcessingException) {
            listOfTargetObjects = null;
        } catch (Exception exception) {
            listOfTargetObjects = null;
        }

        return listOfTargetObjects;
    }
...
z0qdvdin

z0qdvdin4#

这是一个用Jackson解析简单的基于List的泛型的例子,带有一个简单的Java注解!

package innovate.tamergroup.lastmiledelivery.loader.otm.models;

import java.util.List;

import javax.annotation.Generated;

import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "hasMore",
    "limit",
    "count",
    "offset",
    "items",
    "links"
})
@Generated("jsonschema2pojo")
public class OTMListWrapper<T> {

@JsonProperty("hasMore")
private Boolean hasMore;
@JsonProperty("limit")
private Long limit;
@JsonProperty("count")
private Long count;
@JsonProperty("offset")
private Long offset;
@JsonTypeInfo(use=JsonTypeInfo.Id.NONE, include=JsonTypeInfo.As.PROPERTY, property="items")
private List<T> items = null;
@JsonProperty("links")
private List<OTMLink> links = null;

@JsonProperty("hasMore")
public Boolean getHasMore() {
    return hasMore;
}

@JsonProperty("hasMore")
public void setHasMore(Boolean hasMore) {
    this.hasMore = hasMore;
}

public OTMListWrapper<T> withHasMore(Boolean hasMore) {
    this.hasMore = hasMore;
    return this;
}

@JsonProperty("limit")
public Long getLimit() {
    return limit;
}

@JsonProperty("limit")
public void setLimit(Long limit) {
    this.limit = limit;
}

public OTMListWrapper<T> withLimit(Long limit) {
    this.limit = limit;
    return this;
}

@JsonProperty("count")
public Long getCount() {
    return count;
}

@JsonProperty("count")
public void setCount(Long count) {
    this.count = count;
}

public OTMListWrapper<T> withCount(Long count) {
    this.count = count;
    return this;
}

@JsonProperty("offset")
public Long getOffset() {
    return offset;
}

@JsonProperty("offset")
public void setOffset(Long offset) {
    this.offset = offset;
}

public OTMListWrapper<T> withOffset(Long offset) {
    this.offset = offset;
    return this;
}

@JsonProperty("items")
public List<T> getItems() {
    return items;
}

@JsonProperty("items")
public void setItems(List<T> items) {
    this.items = items;
}

public OTMListWrapper<T> withItems(List<T> items) {
    this.items = items;
    return this;
}

@JsonProperty("links")
public List<OTMLink> getLinks() {
    return links;
}

@JsonProperty("links")
public void setLinks(List<OTMLink> links) {
    this.links = links;
}

public OTMListWrapper<T> withLinks(List<OTMLink> links) {
    this.links = links;
    return this;
}

}

相关问题