Gson - конвертировать из Json в типизированный ArrayList<T>
Используя библиотеку 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
, Что я делаю?
10 ответов
Вы можете использовать TypeToken для загрузки строки json в пользовательский объект.
logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());
Ваш образец JSON:
{
"status": "ok",
"comment": "",
"result": {
"id": 276,
"firstName": "mohamed",
"lastName": "hussien",
"players": [
"player 1",
"player 2",
"player 3",
"player 4",
"player 5"
]
}
так что если вы хотите сохранить массив модулей в ваших SharedPrefferences так:
1 - преобразует ваш возвращенный массив для формата 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.
Почему никто не написал этот простой способ преобразования строки JSON в List?
List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));
Котлин
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)
Если вы хотите использовать массивы, это довольно просто.
logs = gson.fromJson(br, JsonLog[].class); // line 6
Предоставить JsonLog
как массив JsonLog[].class
Если вы хотите преобразовать Json в типизированный ArrayList, неправильно указывать тип объекта, содержащегося в списке. Правильный синтаксис следующий:
Gson gson = new Gson();
List<MyClass> myList = gson.fromJson(inputString, ArrayList.class);
У вас есть такая строка.
"[{"id":2550,"cityName":"Langkawi","hotelName":"favehotel Cenang Beach - Langkawi","hotelId":"H1266070"},
{"id":2551,"cityName":"Kuala Lumpur","hotelName":"Metro Hotel Bukit Bintang","hotelId":"H835758"}]"
Затем вы можете скрыть его в ArrayList через Gson, например
var hotels = Gson().fromJson(historyItem.hotels, Array<HotelInfo>::class.java).toList()
Вашему классу HotelInfo это должно понравиться.
import com.squareup.moshi.Json
data class HotelInfo(
@Json(name="cityName")
val cityName: String? = null,
@Json(name="id")
val id: Int? = null,
@Json(name="hotelId")
val hotelId: String? = null,
@Json(name="hotelName")
val hotelName: String? = null
)
Я не уверен насчет gson, но вот как вы делаете это с Jon. Образец надеюсь, что с gson должен быть похожий способ
{"Players": ["player 1", "player 2", "player 3", "player 4", "player 5"]}
===============================================
import java.io.FileReader;
import java.util.List;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
public class JosnFileDemo {
public static void main(String[] args) throws Exception
{
String jsonfile ="fileloaction/fileName.json";
FileReader reader = null;
JSONObject jsb = null;
try {
reader = new FileReader(jsonfile);
JSONParser jsonParser = new JSONParser();
jsb = (JSONObject) jsonParser.parse(reader);
} catch (Exception e) {
throw new Exception(e);
} finally {
if (reader != null)
reader.close();
}
List<String> Players=(List<String>) jsb.get("Players");
for (String player : Players) {
System.out.println(player);
}
}
}
Котлин
val userList = Gson().fromJson(mList, Array< User >::class.java).toList()
Джава
Gson gson = new Gson();
Type userListType = new TypeToken<ArrayList<User>>(){}.getType();
ArrayList<User> userArray = gson.fromJson(userJson, userListType);
В Kotlin Для отправки: если вы отправляете Arraylist
Gson().toJson(arraylist)
Для получения: Если вы получаете ArrayList
var arraylist = Gson().fromJson(argument, object : TypeToken<ArrayList<LatLng>>() {}.type)
Для отправки: если вы отправляете ModelClass (например, LatLngModel.class)
var latlngmodel = LatlngModel()
latlngmodel.lat = 32.0154
latlngmodel.lng = 70.1254
Gson().toJson(latlngModel)
Для получения: Если вы получаете ModelClass
var arraylist = Gson().fromJson(argument,LatLngModel::class.java )