基於這個問題How to get a class instance of generics type T我已經實現了以下類:嵌套泛型參數的方法參數 - Java的
public class OkJsonConverter<T> {
final Class<T> typeParameterClass;
public OkJsonConverter(Class<T> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}
protected T processJson(String json) throws OkClientException {
T object = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode jsonNode = objectMapper.readTree(json);
if (jsonNode.get("error_code") != null) {
Error error = objectMapper.treeToValue(jsonNode, Error.class);
throw new OkClientException("API returned error", error);
} else {
object = objectMapper.treeToValue(jsonNode, typeParameterClass);
}
} catch (IOException e) {
throw new OkClientException("unable to process json", e);
}
return object;
}
}
我可以使用這個類與一般的參數,例如:
return new OkJsonConverter<User>(User.class).processJson(response.getBody());
但現在我正在努力如何使它與這樣一個嵌套的通用參數工作List<Method>
此代碼不起作用:
return new OkJsonConverter<List<Method>>(List<Method>.class).processJson(response.getBody());
請幫助改變這段代碼爲了讓它工作。
請注意,您的解決方案根本不是類型安全的(如您的'@ SuppressWarnings'所示):即使JSON實際上包含「List」,也可以工作,並且您只會在運行時注意到它在嘗試操作時在'result'上,當你得到'ClassCastException'。作爲一般規則,不惜一切代價避免此類壓制警告,因爲您幾乎可以保證在某個時候遇到麻煩。 –
感謝您的評論。不幸的是,現在我沒有更好的一個 – alexanoid
其實,有一個...只需用'objectMapper.convertValue(jsonNode,type)'替換未檢查的轉換和'treeToValue'調用。 –