Java 7:将GET响应转换为通用对象的通用方法

时间:2019-02-06 16:36:47

标签: java json generics optimization

我有一个自定义的通用方法,该方法向URL发出GET请求,并将JSON响应转换为responseType对象:

public static <T> Object getForEntity(String url, Class<T> responseType) throws InterruptedException, ExecutionException, IOException{
        Response getResponse = callWithHttpGet(url);
        String getResponseJson = getResponse.getBody();
        ObjectMapper getResponseJsonMapper = new ObjectMapper();
        Object obj = getResponseJsonMapper.readValue(getResponseJson, responseType);        
        return obj;
    }

如果我按以下方式调用,则上面的代码可以正常工作:

Object person = getForEntity(PERSON_REST_URL,Person.class);

如何使其按以下方式工作而不是返回对象?

Person person = getForEntity(PERSON_REST_URL, Person.class);

3 个答案:

答案 0 :(得分:2)

首先,让方法返回T而不是Object

public static <T> T getForEntity(...)

然后实现它以返回T。readValue返回正确的类,因为您传入了Class<T>,并且其签名也等效于public <T> T readValue(..., Class<T> clazz),因此您可以这样做:

T obj = getResponseJsonMapper.readValue(getResponseJson, responseType);        
return obj;

答案 1 :(得分:1)

您只需传递一个Class<T>参数。

请注意,您不需要对readValue方法的响应进行强制类型转换,因为您已经传递了clazz作为参数,因此它返回了clazz元素。

您的错误只是将结果分配给了Object类型的对象。比退还了。删除不必要的分配,并直接从调用结果返回到readValue

public static <T> T getForEntity(String url, Class<T> clazz)  throws InterruptedException, 
                                                  ExecutionException, IOException {
    Response getResponse = callWithHttpGet(url);
    String getResponseJson = getResponse.getBody();
    ObjectMapper getResponseJsonMapper = new ObjectMapper();
    return getResponseJsonMapper.readValue(getResponseJson, clazz);        
}

答案 2 :(得分:0)

使用T作为返回参数并进行强制转换(假设可以强制转换-否则会出现运行时异常)。

public static <T> T getForEntity(String url, Class<T> responseType) throws InterruptedException, ExecutionException, IOException{
    Response getResponse = callWithHttpGet(url);
    String getResponseJson = getResponse.getBody();
    ObjectMapper getResponseJsonMapper = new ObjectMapper();
    T obj = (T)getResponseJsonMapper.readValue(getResponseJson, responseType);        
    return obj;
}

在特定情况下,您甚至可以跳过强制转换(如果ObjectMapper已经返回正确的类型,例如Jackson)。