webentwicklung-frage-antwort-db.com.de

Kotlin: Iteriere durch einen JSONArray

Ich schreibe eine Android-App mit Kotlin und Realm . Ich habe einen JSONArray und möchte die JSONObjects in diesem Array durchlaufen, um sie in eine Realm-Datenbankklasse zu laden:

Realm-Klasse:

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() {

}

Der JSONArray:

{
    "persons":[
        {
           "id":0,
           "name":"Biatrix"
        },
        {
           "id":1,
           "name":"Bill"
        },
        {
           "id":2,
           "name":"Oren"
        },
        {
           "id":3,
           "name":"Budd"
        }
    ]
}

Ich habe versucht, wie folgt zu iterieren:

for (item : JSONObject in persons) {

}

... aber ich erhalte eine for-loop range must have an iterator() method-Fehlermeldung.

39
Ambran

Leider macht JsonArray keinen Iterator verfügbar. Sie müssen also mit einem Indexbereich iterieren:

for (i in 0..(persons.length() - 1)) {
    val item = persons.getJSONObject(i)

    // Your code here
}
70
0x60

Selbst wenn eine Klasse keine iterator-Methode verfügbar macht, können Sie sie trotzdem mit der for-Anweisung wiederholen, indem Sie eine Erweiterungsfunktion iterator bereitstellen.

operator fun JSONArray.iterator(): Iterator<JSONObject> 
    = (0 until length()).asSequence().map { get(it) as JSONObject }.iterator()

Wenn Sie jetzt JSONArray in der Anweisung for verwenden, wird diese Erweiterung aufgerufen, um einen Iterator abzurufen. Es erstellt eine Reihe von Indizes und ordnet jeden Index einem Element zu, das diesem Index entspricht. 

Ich nehme an, die Umwandlung in JSONObject ist erforderlich, da das Array nicht nur Objekte, sondern auch Primitive und andere Arrays enthalten kann. Der Aufruf asSequence dient dazu, die Operation map faul auszuführen.

34
Ilya

Wie wäre es mit 

(0..(jsonArray.length()-1)).forEach { i ->
    var item = jsonArray.getJSONObject(i)
}

?

1
Sharif
for (i in 0 until jsonArray.length()){
    //do your stuff
    }
0
VaibhavNalawade