Kotlin convert json array to model list using GSON

2019-06-18 18:43发布

问题:

I am not able to convert a JSON Array into a GroupModel array. Below is the JSON I used:

[{
  "description":"My expense to others",
  "items":["aaa","bbb"],
  "name":"My Expense"
 },
 {
  "description":"My expense to others","
  items":["aaa","bbb"],
  "name":"My Expense"
 }]

and the GroupModel class is:

class GroupModel {
    var name: String? = null
    var description: String? = null
    var items: MutableList<String>? = null

    constructor(name: String, description: String, items: MutableList<String>) {
        this.name = name
        this.description = description
        this.items = items
    }
}

and trying the following code results in an Exception:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

The code:

var model = gson.fromJson<Array<GroupModel>>(inputString, GroupModel::class.java)

回答1:

You need to use a TypeToken to capture the generic type of the array, and you need this to be the type that GSON sees as the target, instead of just GroupModel::class it is really a list of those. You can create a TypeToken and use it as follows:

Type groupListType = new TypeToken<ArrayList<GroupModel>>() {}.getType();
var model = gson.fromJson(inputString, groupListType);


回答2:

[{
  "description":"My expense to others",
  "items":["aaa","bbb"],
  "name":"My Expense"
 },
 {
  "description":"My expense to others","
  items":["aaa","bbb"],
  "name":"My Expense"
 }]

Kotlin Code

val gson = GsonBuilder().create()
val Model= gson.fromJson(body,Array<GroupModel>::class.java).toList()

Gradle

implementation 'com.google.code.gson:gson:2.8.5'


回答3:

I have found a solution that is actually working on Android with Kotlin for parsinng JSON arrays of a given class. The solution of @Aravindraj didn't really work for me.

val fileData = "your_json_string"
val gson = GsonBuilder().setPrettyPrinting().create()
val packagesArray = gson.fromJson(fileData , Array<YourClass>::class.java).toList()

So basically, you only need to provide a class (YourClass in the example) and the JSON string. GSON will figure out the rest.



标签: kotlin gson