【问题标题】:How to use gson deserialize to ArrayList in Kotlin如何在 Kotlin 中使用 gson 反序列化到 ArrayList
【发布时间】:2018-07-17 08:47:36
【问题描述】:

我使用这个类来存储数据

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

【问题讨论】:

    标签: android kotlin gson


    【解决方案1】:

    试试这个代码反序列化列表

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

    【讨论】:

    • 这真的很有帮助。您能否解释一下您的答案,例如您是如何提出第二行的?我是 Kotlin(和 Java)的新手,这个结构对我来说不是很熟悉。例如,为什么你不能让第二个参数像 >.class ?
    • 如果我们不知道Item的类型怎么办?用 JSON 吸 Java、Kotlin。
    • @Zagfai 那么,如果您不知道要反序列化什么,请使用Any,或反序列化为 List。如果你不知道目标数据结构,用任何其他语言都不会更好。
    • @VladD。我只是认为进行类型转换太复杂了。在 JS 或 Python 中更容易。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以这样做:

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

        当面向 JVM 平台时,“Array”代表一个 Java 数组。这不是 ArrayList,但您可以访问这些项目(通常在解析 JSON 后就需要这些)。

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

        itemsList.toMutableList()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-11
          • 1970-01-01
          相关资源
          最近更新 更多