[英]Gson - convert from Json to a typed ArrayList<T>
使用 Gson 庫,如何將 JSON 字符串轉換為自定義類JsonLog
的ArrayList
? 基本上, JsonLog
是由我的 Android 應用程序生成的不同類型的日志實現的接口——短信日志、通話日志、數據日志——而這個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
。 我該怎么辦?
您可以使用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>
List<? extends CharSequence>
。
科特林:
如果您需要在Kotlin中執行此操作,您可以這樣做:
val myType = object : TypeToken<List<JsonLong>>() {}.type
val logs = gson.fromJson<List<JsonLong>>(br, myType)
或者,您可以查看此答案以了解各種替代方案。
您的 JSON 示例是:
{
"status": "ok",
"comment": "",
"result": {
"id": 276,
"firstName": "mohamed",
"lastName": "hussien",
"players": [
"player 1",
"player 2",
"player 3",
"player 4",
"player 5"
]
}
所以如果你想在 SharedPrefrences 中保存模塊的數組列表,那么:
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 Library對您有所幫助。
科特林
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)
為什么沒有人編寫這種在 List 中轉換 JSON 字符串的簡單方法?
List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));
如果你想使用數組,這很簡單。
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"}]"
然后你可以通過Gson將它轉換為ArrayList
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.sample 的方式希望使用 gson 必須有類似的方式
{“玩家”:[“玩家 1”、“玩家 2”、“玩家 3”、“玩家 4”、“玩家 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 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.