Java Gson解析响应以获取泛型类

Java Gson解析响应以获取泛型类,java,json,api,apache-httpclient-4.x,Java,Json,Api,Apache Httpclient 4.x,我有一节反应课 public class ResponseModel<T> { private boolean isRequestSuccessful; public boolean getIsRequestSuccessful() { return this.isRequestSuccessful; } public void setIsRequestSuccessful(boolean isRequestSuccessful)

我有一节反应课

public class ResponseModel<T> {
    private boolean isRequestSuccessful;

    public boolean getIsRequestSuccessful() {
        return this.isRequestSuccessful;
    }

    public void setIsRequestSuccessful(boolean isRequestSuccessful) {
        this.isRequestSuccessful = isRequestSuccessful;
    }

    private String message;

    public String getMessage() {
        return this.message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    private T object;

    public T getObject() {
        return this.object;
    }

    public void setObject(T object) {
        this.object = object;
    }
}
公共类响应模型{
私有布尔请求成功;
公共布尔值getIsRequestSuccessful(){
返回此。isRequestSuccessful;
}
public void setIsRequestSuccessful(布尔值isRequestSuccessful){
this.isRequestSuccessful=isRequestSuccessful;
}
私有字符串消息;
公共字符串getMessage(){
返回此消息;
}
公共无效设置消息(字符串消息){
this.message=消息;
}
私人T对象;
公共T getObject(){
返回此.object;
}
公共无效集合对象(T对象){
this.object=对象;
}
}
我的API将返回T类型。我想解析来自API的响应,并创建一个ResponseModel类型的对象

我正在努力实现下面这样的目标,我可以用c#轻松实现。请提供有关如何使用Java执行此操作的帮助

public static ResponseModel<T> Get(String requestUri) throws ClientProtocolException,IOException {
    CloseableHttpClient client = HttpClientBuilder.create().build();
    HttpGet httpGet = new HttpGet(requestUri);
    httpGet.addHeader("TenantKey", TenantKey);
    httpGet.addHeader("accept", "application/json");
    HttpResponse response = client.execute(httpGet);

    ResponseModel<T> responseModel = new ResponseModel<T>();

    if (response.getStatusLine().getStatusCode() == 200) {
        Gson gson = new GsonBuilder().create();
        // parse the response as T and and assign to object of ResponseModel 
        responseModel.object = ...
    }
    else
    {
        responseModel.message = response.getEntity().getContent();
    }
// return ResponseModel here
}
publicstaticresponsemodelget(stringrequesturi)抛出ClientProtocolException、IOException{
CloseableHttpClient客户端=HttpClientBuilder.create().build();
HttpGet HttpGet=新的HttpGet(请求URI);
httpGet.addHeader(“TenantKey”,TenantKey);
addHeader(“接受”、“应用程序/json”);
HttpResponse response=client.execute(httpGet);
ResponseModel ResponseModel=新的ResponseModel();
if(response.getStatusLine().getStatusCode()==200){
Gson Gson=new GsonBuilder().create();
//将响应解析为T和,并分配给ResponseModel的对象
responseModel.object=。。。
}
其他的
{
responseModel.message=response.getEntity().getContent();
}
//在这里返回ResponseModel
}
C#和Java中的泛型非常不同。简单地说,你在这里做什么毫无意义

您在那里使用的java泛型T有一个编译时特性。它允许您在编译时使用更具体的类型,而不是到处使用
Object

因此,您不能像您可能打算的那样,在“运行时”使用泛型来确定“t”。方法中的T来自“外部”,编译器确定有时它应该是另一个上下文中的
ResponseModel
ResponseModel

您不能让gson读取JSON数据来为您返回特定的
ResponseModel
。如果有的话,您可以使用它根据实际值进行一些切换,以返回这个或那个特定的
响应模型


除此之外:当使用类似bean的类作为响应模型时,您只希望它们是特定的,而不是泛型的

不确定,但我有一个类似的要求,但它适用于Android。这里是参考链接,在这里我必须编写一个泛型类来从Assets文件夹加载不同形式的JSON并解析到POJO类

代码:

private静态字符串convertJSONtoEntity(字符串jsonString,字符串类型字符串){
字符串jsonObjectString=null;
试一试{
JSONObject JSONObject=新的JSONObject(jsonString);
jsonObjectString=jsonObject.get(typeString.toString();
}捕获(例外e){
Log.e(TAG,e.getLocalizedMessage());
}
返回jsonObjectString;
}
来自JSONList的私有静态列表(字符串json,类clazz){
Object[]array=(Object[])java.lang.reflect.array.newInstance(clazz,0);
array=new Gson().fromJson(json,array.getClass());
列表=新的ArrayList();
if(array!=null&&array.length>0){
用于(对象数组:数组){
列表添加(clazz.cast(anArray));
}
}
退货清单;
}
用法:

使用
jsonString
调用
convertJSONtoEntity()
typeString
将是JSON的根元素


使用
convertJSONtoEntity()
类所返回的值调用
fromJsonList()
。这给出了JSON中的对象列表。

在其他答案的帮助下,在Google中进一步搜索,我得到了以下代码

public static <T> ResponseModel<T> Get(Class<?> classType, String requestUri) throws ClientProtocolException, IOException 
{
    CloseableHttpClient client = HttpClientBuilder.create().build();
    HttpGet httpGet = new HttpGet(requestUri);
    httpGet.addHeader("accept", "application/json");
    HttpResponse response = client.execute(httpGet);
    ResponseModel<T> responseModel = new ResponseModel<T>();
    if (response.getStatusLine().getStatusCode() == 200) 
    {
        responseModel.setObject((T) Utils.fromJson(EntityUtils.toString(response.getEntity()), classType));
        responseModel.setIsRequestSuccessful(true);
    } 
    else 
    {
        responseModel.setMessage(response.getEntity().getContent().toString());
        responseModel.setIsRequestSuccessful(false);
    }
    return responseModel;
}
publicstaticresponsemodelget(Class-classType,stringrequesturi)抛出ClientProtocolException,IOException
{
CloseableHttpClient客户端=HttpClientBuilder.create().build();
HttpGet HttpGet=新的HttpGet(请求URI);
addHeader(“接受”、“应用程序/json”);
HttpResponse response=client.execute(httpGet);
ResponseModel ResponseModel=新的ResponseModel();
if(response.getStatusLine().getStatusCode()==200)
{
setObject((T)Utils.fromJson(EntityUtils.toString(response.getEntity()),classType));
responseModel.setIsRequestSuccessful(true);
} 
其他的
{
setMessage(response.getEntity().getContent().toString());
responseModel.setIsRequestSuccessful(false);
}
返回响应模型;
}

请考虑给出一些反馈,也许在某个时候接受或接受。@ GooCad抱歉延迟,我更新了这个问题,当我得到足够的内容来获得一个好的自我回答,然后简单地写一个,然后接受它。“把答案放在问题本身并不是解决这个问题的好方法。”GhostCat Done。谢谢
public static <T> ResponseModel<T> Get(Class<?> classType, String requestUri) throws ClientProtocolException, IOException 
{
    CloseableHttpClient client = HttpClientBuilder.create().build();
    HttpGet httpGet = new HttpGet(requestUri);
    httpGet.addHeader("accept", "application/json");
    HttpResponse response = client.execute(httpGet);
    ResponseModel<T> responseModel = new ResponseModel<T>();
    if (response.getStatusLine().getStatusCode() == 200) 
    {
        responseModel.setObject((T) Utils.fromJson(EntityUtils.toString(response.getEntity()), classType));
        responseModel.setIsRequestSuccessful(true);
    } 
    else 
    {
        responseModel.setMessage(response.getEntity().getContent().toString());
        responseModel.setIsRequestSuccessful(false);
    }
    return responseModel;
}