Подтвердить что ты не робот

Можно ли использовать Gson.fromJson(), чтобы получить ArrayList <ArrayList <String>>?

скажем, у меня есть массив массивов json

String jsonString = [["John","25"],["Peter","37"]];

Я хотел бы поместить это в объекты ArrayList<ArrayList<String>>. когда я использовал

Gson.fromJson(jsonString,ArrayList<ArrayList<String>>.class)

он не работает, и я работал с помощью

Gson.fromJson(jsonString,String[][].class)

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Да, используйте TypeToken.

ArrayList<ArrayList<String>> list = gson.fromJson(jsonString, new TypeToken<ArrayList<ArrayList<String>>>() {}.getType());

TypeToken позволяет указать типичный тип, который вы действительно хотите, что помогает Gson найти типы, которые будут использоваться во время десериализации.

Он использует этот драгоценный камень: Class#getGenericSuperClass(). Тот факт, что это анонимный класс, делает его подклассом TypeToken<...>. Это эквивалентно классу типа

class Anonymous extends TypeToken<...>

В спецификации метода указано, что

Если суперкласс является параметризованным типом, возвращаемый объект Type должен точно отражать фактические параметры типа, используемые в исходном коде.

Если вы указали

new TypeToken<String>(){}.getType();

Возвращаемый объект Type фактически будет ParameterizedType, на котором вы можете получить фактические аргументы типа ParameterizedType#getActualTypeArguments().

Аргументом типа будет Type объект для java.lang.String в приведенном выше примере. В вашем примере это будет соответствующий объект Type для ArrayList<ArrayList<String>>. Gson продолжал бы спускаться по цепочке, пока не построит полную карту типов, в которых она нуждается.