Ваш ввод - это массив json с двумя объектами. Однако ваша целевая переменная «тип» имеет тип Object, а не «Array of Objects». Проще говоря, Map не может хранить массив.
Позволяет использовать более простой подход к этой проблеме (не рекомендуемый подход). Если мы преобразуем карту вручную в массив карт, это будет выглядеть следующим образом:
yourJson -> [Map1(en,category1(Ap,ap2)),Map2(en,category2(Ap,ap2))]
т.е. массив Карт
Таким образом, в эквиваленте Java это становится:
Type typeOfT2 = new TypeToken<ArrayList<HashMap<String, Category>>>() {}.getType();
List<HashMap<String, Category>> list = gson.fromJson(text, typeOfT2);
Мы добиваемся того, чего хотим, но есть лучшие способы сделать это. Для этого нам нужен Джексон, а не Гсон. (Кто-то может добавить решение на основе Гсона, уверен, что существует более чистое решение, чем указано выше). Здесь мы будем использовать ObjectMapper
из com.fasterxml.jackson.databind.ObjectMapper
ObjectMapper om = new ObjectMapper();
List<Map.Entry<String, Category>> listx = om.readValue(text, ArrayList.class);
Если вы напечатаете listx
. Вы можете видеть это (переопределено toString()
класса Category):
[{en={key1=Ap, key2=ap2}}, {ar={key1=Ap, key2=ap2}}]
listx
является наиболее точным представлением вашего json, а не карты.
Теперь, если вам нужна карта, я оставлю это в качестве упражнения для вас о том, как преобразовать ваш Список Map.Entry в реализацию Map.
PS: Первый длинный ответ здесь. Извиняюсь за любые ошибки.