web-dev-qa-db-ja.com

Kotlin:JSONArrayを反復処理する

KotlinとRealmを使用してAndroidアプリを作成しています。

レルムクラス:

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

}
_

JSONArray:

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

私は次のように繰り返してみました:

_for (item : JSONObject in persons) {

}
_

...しかし、for-loop range must have an iterator() methodエラーが表示されます。

50
Ambran

残念ながら、JsonArrayはイテレータを公開しません。そのため、インデックス範囲を使用して繰り返し処理する必要があります。

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

    // Your code here
}
95
0x60

一部のクラスがiteratorメソッドを公開しない場合でも、拡張関数forを提供することにより、iteratorステートメントで繰り返し処理できます。

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

JSONArrayステートメントでforを使用すると、イテレータを取得するためにこの拡張機能が呼び出されます。一連のインデックスを作成し、各インデックスをこのインデックスに対応するアイテムにマッピングします。

配列にはオブジェクトだけでなくプリミティブや他の配列も含めることができるため、JSONObjectへのキャストが必要だと思います。 asSequence呼び出しは、map操作を怠zyな方法で実行するためにここにあります。

36
Ilya

どう?

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

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