将Json转换为类型化的ArrayList<

使用Gson库,如何将JSON字符串转换为自定义类JsonLogArrayList ?基本上,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。我该怎么办?

279301 次浏览

你可以使用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>

芬兰湾的科特林:

如果你需要在芬兰湾的科特林中这样做,你可以这样做:

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"
]
}

所以如果你想在你的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图书馆对你有所帮助

我不确定gson怎么样但这就是你和Jon相处的方式。样品希望一定有类似的方法使用gson

< p > { “玩家”:( “玩家1”, “玩家2”, “玩家3”, “球员4”, “球员5” ] } < / p >

===============================================

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);
}
}
}

如果你想使用数组,这很简单。

logs = gson.fromJson(br, JsonLog[].class); // line 6

提供JsonLog作为数组JsonLog[].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)

为什么没有人写这个在列表中转换JSON字符串的简单方法 ?

List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].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
)

如果你想将Json转换为类型化的ArrayList,指定列表中包含的对象的类型是错误的。正确的语法如下:

 Gson gson = new Gson();
List<MyClass> myList = gson.fromJson(inputString, ArrayList.class);

< >强在芬兰湾的科特林 用于发送:如果发送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 )