но затем я получаю сообщение об ошибке в Eclipse "Тип new List<MyClass>() {} должен реализовать унаследованный абстрактный метод ...", и если я использую быстрое исправление, я получаю чудовище из более чем 20 заглушек методов.
Я почти уверен, что есть более простое решение, но, похоже, я не могу его найти!
Однако я получаю следующее исключение в fromJson строке:
java.lang.NullPointerException at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47) at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83) at java.lang.StringBuilder.append(StringBuilder.java:203) at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56) at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88) at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76) at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106) at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64) at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49) at com.google.gson.Gson.fromJson(Gson.java:568) at com.google.gson.Gson.fromJson(Gson.java:515) at com.google.gson.Gson.fromJson(Gson.java:484) at com.google.gson.Gson.fromJson(Gson.java:434)
Я делаю перехват JsonParseExceptions и result не равен null.
Я проверил listType с помощью отладчика и получил следующее:
list Type
args = ListOfTypes
list = null
resolvedTypes = Type[ 1 ]
loader = PathClassLoader
ownerType0 = null
ownerTypeRes = null
rawType = Class (java.util.ArrayList)
rawTypeName = "java.util.ArrayList"
Похоже, что getClass вызов не сработал должным образом. Есть предложения ...?
Я проверил в Руководстве пользователя Gson . Там упоминается исключение во время выполнения, которое должно произойти при преобразовании универсального типа в Json. Я сделал это "неправильно" (не показано выше), как в примере, но вообще не получил этого исключения. Поэтому я изменил сериализацию, как предложено в руководстве пользователя. Хотя это не помогло.
Поскольку несколько человек в комментариях упомянули об этом, вот объяснение того, как используется класс TypeToken. Конструкция new TypeToken<...>() {}.getType() фиксирует тип времени компиляции (между < и >) в объекте времени выполнения java.lang.reflect.Type. В отличие от Class объекта, который может представлять только необработанный (удаленный) тип, Type объект может представлять любой тип на языке Java, включая параметризованный экземпляр универсального типа.
У TypeToken самого класса нет открытого конструктора, потому что вы не должны создавать его напрямую. Вместо этого вы всегда создаете анонимный подкласс (отсюда {}, который является необходимой частью этого выражения).
Из-за удаления типов TypeToken класс способен фиксировать только те типы, которые полностью известны во время компиляции. (То есть вы не можете сделать new TypeToken<List<T>>() {}.getType() для параметра типа T.)
Таким образом, вы избегаете всех проблем с типом object, и если вам действительно нужен список, вы всегда можете преобразовать массив в список с помощью:
List<MyClass> mcList = Arrays.asList(mcArray);
ИМХО, это гораздо более читабельно.
И чтобы это был реальный список (который можно изменять, см. Ограничения Arrays.asList()), просто выполните следующее: