使用Gson库,如何将JSON字符串转换为自定义类JsonLog的数组列表?基本上,JsonLog是由我的Android应用程序制作的不同类型的日志实现的接口——短信日志、通话日志、数据日志——这个数组列表是所有这些日志的集合。第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
}
}
编译器似乎不明白我引用的是一个类型化的数组列表。我该怎么办?
我不确定gson怎么样但这就是你和Jon相处的方式。样品希望一定有类似的方法使用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);
}
}
}
你可以使用TypeToken将json字符串加载到一个自定义对象中。
logs = gson.fromJson(br, new TypeToken<List<JsonLog>>(){}.getType());
文档:
Represents a generic type T.
Java doesn't yet provide a way to represent generic types, so this class does. Forces clients to create a subclass of this class which enables retrieval the type information even at runtime.
For example, to create a type literal for List<String>, you can create an empty anonymous inner class:
TypeToken<List<String>> list = new TypeToken<List<String>>() {};
This syntax cannot be used to create type literals that have wildcard parameters, such as Class<?> or List<? extends CharSequence>.
科特林:
如果你需要在Kotlin中这样做,你可以这样做:
val myType = object : TypeToken<List<JsonLong>>() {}.type
val logs = gson.fromJson<List<JsonLong>>(br, myType)
或者你可以从其他选项中看到这个答案。
假设,你有一条这样的弦。
"[{"id":2550,"cityName":"Langkawi","hotelName":"favehotel Cenang Beach - Langkawi","hotelId":"H1266070"},
{"id":2551,"cityName":"Kuala Lumpur","hotelName":"Metro Hotel Bukit Bintang","hotelId":"H835758"}]"
然后你可以通过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
)
你的JSON样本是:
{
"status": "ok",
"comment": "",
"result": {
"id": 276,
"firstName": "mohamed",
"lastName": "hussien",
"players": [
"player 1",
"player 2",
"player 3",
"player 4",
"player 5"
]
}
所以如果你想在你的sharedpreferences中保存模块的数组列表,那么:
1-使用此方法将返回的数组列表转换为json格式
public static String toJson(Object jsonObject) {
return new Gson().toJson(jsonObject);
}
2-保存在共享prefreneces中
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());
如果你想解析对象的数组列表,这个解决方案也是可行的
希望对你使用Gson库有所帮助。
在芬兰湾的科特林
用于发送:如果发送Arraylist
Gson().toJson(arraylist)
接收:如果接收ArrayList
var arraylist = Gson().fromJson(argument, object : TypeToken<ArrayList<LatLng>>() {}.type)
用于发送:如果您发送ModelClass(例如latlnmodel .class)
var latlngmodel = LatlngModel()
latlngmodel.lat = 32.0154
latlngmodel.lng = 70.1254
Gson().toJson(latlngModel)
用于接收:如果您接收ModelClass
var arraylist = Gson().fromJson(argument,LatLngModel::class.java )