Android

Gson - convert from Json to a typed ArrayList

Gson - преобразовать из Json в типизированный ArrayList

Используя библиотеку Gson, как мне преобразовать строку JSON в ArrayList пользовательский класс JsonLog? По сути, JsonLog это интерфейс, реализованный различными видами журналов, создаваемых моим приложением для Android - журналами SMS, журналами вызовов, журналами данных - и это ArrayList представляет собой их совокупность. Я продолжаю получать ошибку в строке 6.

public static void log(File destination, JsonLog log) {
Collection<JsonLog> logs = null;
if (destination.exists()) {
Gson gson = new Gson();
BufferedReader br = new BufferedReader(new FileReader(destination));
logs = gson.fromJson(br, ArrayList<JsonLog>.class); // line 6
// logs.add(log);
// serialize "logs" again
}
}

Кажется, компилятор не понимает, что я имею в виду типизированный ArrayList. Что мне делать?

Переведено автоматически
Ответ 1

Вы можете использовать TypeToken для загрузки строки json в пользовательский объект.

logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());

Документация:


Представляет универсальный тип T.


Java пока не предоставляет способа представления универсальных типов, поэтому этот класс предоставляет. Заставляет клиентов создавать подкласс этого класса, который позволяет извлекать информацию о типе даже во время выполнения.


Например, чтобы создать литерал типа для List<String>, вы можете создать пустой анонимный внутренний класс:


TypeToken<List<String>> list = new TypeToken<List<String>>() {};


Этот синтаксис нельзя использовать для создания литералов типа, которые имеют подстановочные параметры, такие как Class<?> или List<? extends CharSequence>.


Kotlin:

Если вам нужно сделать это в Kotlin, вы можете сделать это следующим образом:

val myType = object : TypeToken<List<JsonLong>>() {}.type
val logs = gson.fromJson<List<JsonLong>>(br, myType)

Или вы можете увидеть этот ответ для различных альтернатив.

Ответ 2

Ваш пример JSON:

{
"status": "ok",
"comment": "",
"result": {
"id": 276,
"firstName": "mohamed",
"lastName": "hussien",
"players": [
"player 1",
"player 2",
"player 3",
"player 4",
"player 5"
]
}

итак, если вы хотите сохранить arraylist модулей в ваших SharedPrefrences, то :

1- преобразует возвращенный вами arraylist в формат json с помощью этого метода

public static String toJson(Object jsonObject) {
return new Gson().toJson(jsonObject);
}

2- Сохраните это в общих настройках

PreferencesUtils.getInstance(context).setString("players", toJson((.....ArrayList you want to convert.....)));

3- чтобы получить его в любое время, получите jsonString из общих настроек следующим образом

String playersString= PreferencesUtils.getInstance(this).getString("players");

4- снова преобразовать в список массивов

public static Object fromJson(String jsonString, Type type) {
return new Gson().fromJson(jsonString, type);
}

ArrayList<String> playersList= (ArrayList<String>) fromJson(playersString,
new TypeToken<ArrayList<String>>() {
}.getType());

это решение также выполнимо, если вы хотите проанализировать ArrayList объектов
Надеюсь, оно поможет вам, если вы используете библиотеку Gson .

Ответ 3

Почему никто не написал этот простой способ преобразования строки JSON в список?

List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));
Ответ 4

Kotlin


data class Player(val name : String, val surname: String)

val json = [
{
"name": "name 1",
"surname": "surname 1"
},
{
"name": "name 2",
"surname": "surname 2"
},
{
"name": "name 3",
"surname": "surname 3"
}
]

val typeToken = object : TypeToken<List<Player>>() {}.type
val playerArray = Gson().fromJson<List<Player>>(json, typeToken)

или

val playerArray = Gson().fromJson(json, Array<Player>::class.java)
java android json gson