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

时间:2018-07-17 08:47:37

标签: android kotlin gson

我使用此类存储数据

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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(或任何其他通用对象)。