Gson解析响应以获取泛型类

时间:2018-08-13 07:21:05

标签: 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) {
        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;
    }
}

我的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
}

2 个答案:

答案 0 :(得分:1)

C#和Java中的泛型完全不同。简而言之,您在这里做什么毫无意义。

您正在使用的Java通用T具有 compile 时间功能。它允许您在 compile 时使用更多特定类型,而不是在各处使用Object

因此,您可能无法按预期在“运行时”使用泛型确定“ T”。您的方法中的T来自“外部”,编译器确定在其他情况下它有时应为ResponseModel<Integer>ResponseModel<Whatever>

您不能让gson读取JSON数据来为您返回特定的ResponseModel<Whatever>。如果有的话,您也许可以使用TypeAdapter magic根据实际值进行一些切换,以返回该值或特定 ResponseModel<Foo>

除此之外:当使用类似 bean的类作为ResponseModel时,您只是希望它们是特定的,而不是通用的。

答案 1 :(得分:0)

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

https://github.com/gokulnathperiasamy/Android-Helper/blob/master/JSONHelper.java

代码:

    private static String convertJSONtoEntity(String jsonString, String typeString) {
        String jsonObjectString = null;
        try {
            JSONObject jsonObject = new JSONObject(jsonString);
            jsonObjectString = jsonObject.get(typeString).toString();
        } catch (Exception e) {
            Log.e(TAG, e.getLocalizedMessage());
        }
        return jsonObjectString;
    }

    private static <T> List<T> fromJsonList(String json, Class<T> clazz) {
        Object[] array = (Object[]) java.lang.reflect.Array.newInstance(clazz, 0);
        array = new Gson().fromJson(json, array.getClass());
        List<T> list = new ArrayList<>();
        if (array != null && array.length > 0) {
            for (Object anArray : array) {
                list.add(clazz.cast(anArray));
            }
        }
        return list;
    }

用法:

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

使用fromJsonList()convertJSONtoEntity()返回的值调用Class。这给出了来自JSON的对象列表。