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

5sxhfpxr  于 2022-11-06  发布在  Kotlin
关注(0)|答案(4)|浏览(251)

我使用这个类来存储数据

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

并在数组列表中使用它

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的正确方法是什么?

qco9c6ql

qco9c6ql1#

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

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

fdx2calv2#

您可以定义内联具体化扩展函数,如下所示:

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(或任何其他泛型Object)。

lp0sw83n

lp0sw83n3#

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

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***
hc8w905p

hc8w905p4#

您可以直接执行以下操作,而不是使用已接受的答案(该答案有效,但创建一个对象来获取其类型):

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

在面向JVM平台时,“Array”代表一个Java数组,它不是一个ArrayList,但是你可以访问其中的项(通常在解析JSON之后就可以访问了)。
如果您仍然需要操作列表,可以通过执行以下操作轻松地将其转换为可变列表:

itemsList.toMutableList()

相关问题