2015-08-05 2 views
0

То, что я пытаюсь сделать, и я не знаю, возможно ли это, - получить тип класса объекта, а затем использовать его в объявлении , Я использую библиотеку Gson для Json Conversion, и я хочу создать метод, который может взять любой объект Arraylist и преобразовать его в JsonArray. То, что у меня есть, это код. Arraylist типа X будет отбрасываться до типа Object и передан ниже. INSERT_CLASS_HERE должен быть динамическим на основе типа объекта.Получить класс Тип объекта и использовать его в объявлении переменной

public static JsonArray getJsonArray(List<Object> list , Class theClass){ 

    Gson gson = new Gson(); 
    JsonElement element = gson.toJsonTree(list, new TypeToken<List<INSERT_CLASS_TYPE_HERE>>() {}.getType()); 

    if (! element.isJsonArray()) { 
     try { 
      throw new Exception(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    JsonArray jsonArray = element.getAsJsonArray(); 
    return jsonArray; 
} 

Что я попытался было следующее, но это не правильный синтаксис и будет бросать ошибки

public static JsonArray getJsonArray(List<Object> list , Class theClass){ 
    if(list.size() == 0) return null; 

    Gson gson = new Gson(); 
    JsonElement element = gson.toJsonTree(list, new TypeToken<List<theClass>>() {}.getType()); 

    if (! element.isJsonArray()) { 
    // fail appropriately 
     try { 
      throw new Exception(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    JsonArray jsonArray = element.getAsJsonArray(); 
    return jsonArray; 
} 

1) Возможно ли это сделать, и если нет, то почему? 2) Если это не так, как это можно достичь?

Спасибо!

+0

Если вы приводите его, пока это не объект, '.getClass()' просто вернет объект ... – River

+0

Кроме того, как правило, в Java , [generics] (https://docs.oracle.com/javase/tutorial/java/generics/) используются для такого рода вещей – River

+0

Тогда предположим, что я передаю тип класса в качестве параметра. – applecrusher

ответ

1

Почему вы передаете значение типа? Это не требуется.

public static JsonArray getJsonArray(List<Object> list){ 
    if(list.size() == 0) return null; 

    Gson gson = new Gson(); 
    JsonElement element = gson.toJsonTree(list); 
    JsonArray jsonArray = element.getAsJsonArray(); 
    return jsonArray; 
} 

еще лучше, чтобы избежать литья вы можете сделать следующее

public static <T> JsonArray getJsonArray(List<T> list){ 
    if(list.size() == 0) return null; 

    Gson gson = new Gson(); 
    JsonElement element = gson.toJsonTree(list); 
    JsonArray jsonArray = element.getAsJsonArray(); 
    return jsonArray; 
} 
+0

Извините, я отредактировал и сделал ошибку – applecrusher

+0

@ user1917363 Что вы? Код, который я опубликовал, работает, если нет других неустановленных требований. – cyroxis

+0

Хорошо. Теперь я не получаю ошибок. – applecrusher

1

Кажется, что вы пытаетесь сделать по строкам Java generics.

Это должно быть довольно просто сделать с помощью дженериков:

public static <T> JsonArray getJsonArray(List<T> list){ 
    if(list.size() == 0) return null; 

    Gson gson = new Gson(); 
    JsonElement element = gson.toJsonTree(list, new TypeToken<List<T>>() {}.getType()); 
    //Not familiar with gson, but you might be able to just use T here instead 
+0

Я не могу сделать Список . Дает мне ошибку. – applecrusher

+0

@ user1917363 исправлено, вам нужен в заголовке метода – River

-1

попробуйте изменить сигнатуру метода, как это:

public static <T> JsonArray getJsonArray(List<Object> list, Class<T> theClass)

Вы тогда должны быть в состоянии сделать это:

new TypeToken<List<T>>

+0

Зачем оставлять тип списка как объект? Просто используйте список для дженериков, а не добавьте дополнительный объект класса. – River

Смежные вопросы