簡體   English   中英

如何將 Jackson ObjectMapper.readValue 與泛型類一起使用

[英]How to use Jackson ObjectMapper.readValue with generic class

Jackson ObjectMapper.readValue怎么用泛型類,有人說需要JavaType,但是JavaType也在拼接其他類,Jackson可以像gson TypeToken一樣使用嗎?

我的代碼是這樣的

    public static void main(String[] args) throws IOException {
    String json = "{\"code\":200,\"msg\":\"success\",\"reqId\":\"d1ef3b76e73b40379f895a3a7f1389e2\",\"cost\":819,\"result\":{\"taskId\":1103,\"taskName\":\"ei_custom_config\",\"jobId\":233455,\"status\":2,\"interrupt\":false,\"pass\":true}}";
    RestResponse<TaskResult> result = get(json);
    System.out.println(result);
    System.out.println(result.getResult().getJobId());
}

public static <T> RestResponse<T> get(String json) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    return objectMapper.readValue(json, new TypeReference<RestResponse<T>>() {});
}

錯誤是

org.example.zk.RestResponse@6fd02e5
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.example.zk.TaskResult
    at org.example.zk.JacksonTest.main(JacksonTest.java:15)

您需要為傑克遜提供T的具體類型信息。 我建議使用帶有參數的readValue()重載 - JavaType

添加T的類作為get()的參數並使用它構造參數類型。

public static <T> RestResponse<T> get(String json, Class<T> classOfT) throws IOException {
  ObjectMapper objectMapper = new ObjectMapper();
  JavaType type = TypeFactory.defaultInstance().constructParametricType(RestResponse.class, classOfT);
  return objectMapper.readValue(json, type);
}

用法:

RestResponse<TaskResult> result = get(json, TaskResult.class);

我們可以使 T 具有上限以幫助推斷對象類型。

public static <T extends TaskResult> RestResponse<T> get(String json) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    return objectMapper.readValue(json, new TypeReference<RestResponse<T>>() {});
}

沒有類型邊界,RestResponse<T> 等於 RestResponse<Object>
我們不能用 T 新建一個泛型類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM