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