我使用此类存储数据
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的正确方法是什么?
答案 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
(或任何其他通用对象)。