我使用这个类来存储数据
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)
希望这能帮助到某人:(为干杯