Я пытаюсь решить проблему, возникающую при десериализации HashMap<Integer, MyParcelablePojo>
. Пытаясь найти ответ, я нашел следующие вопросы:
Если я попробую с:
HashMap<Integer, MyParcelablePojo> mHashMap = new Gson().fromJson(the_json_string, HashMap.class);
... полученный HashMap
содержит LinkedTreeMap
объектов вместо MyParcelablePojo
объектов.
Из-за этого я попытался использовать TypeToken
аналогично тому, как я видел во втором вопросе, связанном выше, но он не позволяет мне указать параметры HashMap
. Если я попытаюсь:
// XXX I am not sure if this "Type" is the correct one
// there were several "Type" classes to choose from
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>();
... Android Studio показывает эту ошибку:
«TypeToken ()» имеет защищенный доступ в «com.google.gson.reflect.TypeToken»
... просто для того, чтобы придерживаться примера, который я видел, я попытался с помощью new TypeToken<HashMap<T>>
проверить, исчезла ли ошибка (просто для любопытства, я вообще не заинтересован в использовании универсального T
для этого), и затем он сказал: «не могу решить Т», что слишком странно ... но это не имеет отношения к моей проблеме, я просто добавил ее ради полноты ...
... возвращаясь к точке , так что конструктор TypeToken
защищен, верно? Таким образом, расширение класса может помочь, верно? Но если я увижу конструктор, это будет слишком странно для меня, чтобы понять. Параметризованные типы очень странно использовать таким образом (по крайней мере, для моего текущего понимания их). Часть <? super T>
немного сбивает с толку (похоже, она вызывает родительский тип T
, но я просто не до конца понимаю). Но, что еще более странно для меня, это $Gson$Types.getRawType(type)
... Интересно, для чего эти $
используются ...:
protected TypeToken() {
this.type = getSuperclassTypeParameter(getClass());
this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
this.hashCode = type.hashCode();
}
Прямо в точку
Я просто хочу избежать того, что метод Gson.fromJson
возвращает LinkedTreeMap
в качестве значений вместо MyParcelablePojo
. Ответы, представленные в связанных вопросах, кажутся мне слишком общими, поэтому я не понимаю, как применить их к моему делу (обратите внимание, что сейчас я не заинтересован в универсальности). Я даже сомневаюсь, что они могут быть применимы к моему делу.
Основной мотив, которым я пользуюсь HashMap, заключается в том, что я хочу сам определять индексы, используя базу идентификаторов. Что я должен сделать, чтобы решить эту проблему десериализации из строки JSON должным образом?