Kotlin: 通过 JSONArray 进行迭代

我正在写一个安卓应用程序使用 Kotlin。 我有一个 JSONArray,我想循环访问这个数组中的 JSONObjects,以便将它们装载到一个 Domain 数据库类中:

领域类:

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错误。

70339 次浏览

Unfortunately, JsonArray does not expose an iterator. So you will have to iterate through it using an index range:

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


// Your code here
}

Even if some class doesn't expose an iterator method, you can still iterate it with for statement by providing an extension function iterator:

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

Now when you use JSONArray in for statement this extension is invoked to get an iterator. It creates a range of indices and maps each index to an item corresponding to this index.

I suppose the cast to JSONObject is required as the array can contain not only objects but also primitives and other arrays. And the asSequence call is here to execute map operation in a lazy way.

Generic way (assuming all array entries are of same type)

@Suppress("UNCHECKED_CAST")
operator fun <T> JSONArray.iterator(): Iterator<T>
= (0 until length()).asSequence().map { get(it) as T }.iterator()

How about

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

?

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

shortest way is:

(0 until persons.length()).forEach {
val item = persons.getJSONObject(it)

Basically from a range taking from zero to the jsonarray lenght ,it takes one number at time and use it as a index to retrieve the current object