Gson -从Json转换为类型化的ArrayList< T>

cnh2zyt3  于 2022-11-06  发布在  其他
关注(0)|答案(9)|浏览(217)

使用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。我该怎么办?

r55awzrz

r55awzrz1#

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

或者,您可以查看this answer以了解各种替代方案。

u2nhd7ah

u2nhd7ah2#

您的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-将其保存在共享前缀中

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 Library来帮助你。

yrefmtwq

yrefmtwq3#

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

List<Object> list = Arrays.asList(new GsonBuilder().create().fromJson(jsonString, Object[].class));
t5zmwmid

t5zmwmid4#

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)
xpszyzbs

xpszyzbs5#

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

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

JsonLog作为数组JsonLog[].class提供

ewm0tg9j

ewm0tg9j6#

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

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

gdx19jrr7#

比如说,你有一个像这样的字符串

"[{"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
)
1zmg4dgp

1zmg4dgp8#

我不知道gson,但这是你如何与jonsample希望一定有类似的方式使用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);
                }           
    }
}
wztqucjr

wztqucjr9#

在Kotlin****发送:如果发送数组列表

Gson().toJson(arraylist)

用于接收:如果您收到数组列表

var arraylist = Gson().fromJson(argument, object : TypeToken<ArrayList<LatLng>>() {}.type)

用于发送:如果您发送模型类(例如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 )

相关问题