J'écris une application Android à l'aide de Kotlin et de Realm . J'ai un JSONArray et je souhaite parcourir les objets JSON de ce tableau pour les charger dans une classe de base de données Realm:
Classe de royaume:
import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import io.realm.annotations.Required
open class Person(
@PrimaryKey open var id: Long = 0,
@Required
open var name: String = ""
) : RealmObject() {
}
Le JSONArray:
{
"persons":[
{
"id":0,
"name":"Biatrix"
},
{
"id":1,
"name":"Bill"
},
{
"id":2,
"name":"Oren"
},
{
"id":3,
"name":"Budd"
}
]
}
J'ai essayé d'itérer comme suit:
for (item : JSONObject in persons) {
}
... mais j'obtiens une erreur for-loop range must have an iterator() method
.
Malheureusement, JsonArray
n'expose pas d'itérateur. Il vous faudra donc parcourir cette liste en utilisant une plage d'index:
for (i in 0..(persons.length() - 1)) {
val item = persons.getJSONObject(i)
// Your code here
}
Même si une classe n'expose pas de méthode iterator
, vous pouvez toujours la parcourir avec une instruction for
en fournissant une fonction d'extension iterator
:
operator fun JSONArray.iterator(): Iterator<JSONObject>
= (0 until length()).asSequence().map { get(it) as JSONObject }.iterator()
Désormais, lorsque vous utilisez JSONArray
dans l'instruction for
, cette extension est appelée pour obtenir un itérateur. Il crée une plage d'index et mappe chaque index à un élément correspondant à cet index.
Je suppose que la conversion en JSONObject
est requise, car le tableau peut contenir non seulement des objets, mais également des primitives et d’autres tableaux. Et l'appel asSequence
est là pour exécuter l'opération map
de manière paresseuse.
Que diriez-vous
(0..(jsonArray.length()-1)).forEach { i ->
var item = jsonArray.getJSONObject(i)
}
?