web-dev-qa-db-fra.com

Kotlin convertit le tableau JSON en liste de modèles à l'aide de GSON

Je ne parviens pas à convertir un tableau JSON en tableau GroupModel. Voici le JSON que j'ai utilisé:

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

et la classe GroupModel est:

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

et essayer le code suivant donne un Exception:

com.google.gson.JsonSyntaxException: Java.lang.IllegalStateException: BEGIN_OBJECT attendu mais BEGIN_ARRAY à la ligne 1 colonne 2 chemin $

Le code:

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

Vous devez utiliser un TypeToken pour capturer le type générique du tableau, et vous devez que ce soit le type que GSON considère comme la cible, au lieu de simplement GroupModel::class c'est vraiment une liste de ceux-ci. Vous pouvez créer un TypeToken et l'utiliser comme suit:

Type groupListType = new TypeToken<ArrayList<GroupModel>>() {}.getType();
var model = gson.fromJson(inputString, groupListType);
7
Aravindraj
[{
  "description":"My expense to others",
  "items":["aaa","bbb"],
  "name":"My Expense"
 },
 {
  "description":"My expense to others","
  items":["aaa","bbb"],
  "name":"My Expense"
 }]

Code Kotlin

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

Gradle

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

J'ai trouvé une solution qui fonctionne réellement sur Android avec Kotlin pour analyser les tableaux JSON d'une classe donnée. La solution de @Aravindraj n'a pas vraiment fonctionné pour moi.

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

Donc, en gros, il vous suffit de fournir une classe (YourClass dans l'exemple) et la chaîne JSON. GSON trouvera le reste.

5
xarlymg89