如何使用gson反序列化到Kotlin中的ArrayList



我使用这个类来存储数据

public class Item(var name:String,
var description:String?=null){
}

并在ArrayList 中使用

public var itemList = ArrayList<Item>()

使用此代码序列化对象

val gs=Gson()
val itemListJsonString = gs.toJson(itemList)

并反序列化

itemList = gs.fromJson<ArrayList<Item>>(itemListJsonString, ArrayList::class.java)

但这种方法会给我LinkedTreeMap,而不是Item,我无法将LinkedTreeMap转换为Item

在Kotlin中反序列化为json的正确方法是什么?

尝试使用此代码来反序列化列表

val gson = Gson()
val itemType = object : TypeToken<List<Item>>() {}.type
itemList = gson.fromJson<List<Item>>(itemListJsonString, itemType)

您可以定义一个内联的具体化扩展函数,如:

internal inline fun <reified T> Gson.fromJson(json: String) =
fromJson<T>(json, object : TypeToken<T>() {}.type)

并像一样使用它

val itemList: List<Item> = gson.fromJson(itemListJsonString)

默认情况下,类型在运行时被擦除,因此Gson不知道它必须反序列化哪种类型的List。但是,当您将类型声明为reified时,您将在运行时保留它。因此,现在Gson有足够的信息来反序列化List(或任何其他通用对象(。

在我的代码中,我只使用:

import com.google.gson.Gson
Gson().fromJson(string_var, Array<Item>::class.java).toList() as ArrayList<Type>

我在这里举一个完整的例子。

首先是类型和列表数组:

class Item(var name:String,
var description:String?=null)
var itemList = ArrayList<Item>()

主要代码:

itemList.add( Item("Ball","round stuff"))
itemList.add(Item("Box","parallelepiped stuff"))
val striJSON = Gson().toJson(itemList)  // To JSON
val backList  = Gson().fromJson(        // Back to another variable
striJSON, Array<Item>::class.java).toList() as ArrayList<Item>
val striJSONBack = Gson().toJson(backList)  // To JSON again
if (striJSON==striJSONBack)   println("***ok***")

出口:

***OK***

不用接受的答案(这很有效,但会创建一个对象来获取其类型(,您只需执行以下操作:

val gson = Gson()
itemList = gson.fromJson(itemListJsonString, Array<Item>::class.java)

有";数组";表示以JVM平台为目标时的Java数组。这不是ArrayList,但您可以访问这些项(解析JSON后通常只需要这些项(。

如果您仍然需要操作列表,您可以通过以下操作轻松地将其转换为可变的:

itemsList.toMutableList()

这可能已经得到了答案,但对于截至2023年4月的Kotlin,您可以创建此扩展:

fun <T> Gson.fromJsonList(jsonString: String): List<T> =
this.fromJson(jsonString, object: TypeToken<ArrayList<T>>() { }.type)

然后您可以按如下方式使用它:

val discountList: List<Discount> = Gson().fromJsonList<Discount>(jsonString)

希望这能帮助到某人:(为干杯

最新更新