How to use gson deserialize to ArrayList in Kotlin

You can define a inline reified extension function like:

internal inline fun <reified T> Gson.fromJson(json: String) =
    fromJson<T>(json, object : TypeToken<T>() {}.type)

And use it like:

val itemList: List<Item> = gson.fromJson(itemListJsonString)

By default, types are erased at runtime, so Gson cannot know which kind of List it has to deserialize. However, when you declare the type as reified you preserve it at runtime. So now Gson has enough information to deserialize the List (or any other generic Object).


In my code I just use:

import com.google.gson.Gson
Gson().fromJson(string_var, Array<Item>::class.java).toList() as ArrayList<Type>

I give here a complete example.

First the type and the list array:

class Item(var name:String,
           var description:String?=null)
var itemList = ArrayList<Item>()

The main code:

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

The exit:

***OK***

Try this code for deserialize list

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