Kotlin:通过JSONArray迭代

时间:2016-03-23 17:16:38

标签: android json kotlin

我正在使用Kotlin和Realm编写Android应用程序。 我有一个JSONArray,我想迭代这个数组中的JSONObjects,以便在Realm数据库类中加载它们:

领域类:

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

5 个答案:

答案 0 :(得分:83)

不幸的是,JsonArray没有公开迭代器。所以你必须使用索引范围迭代它:

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

    // Your code here
}

答案 1 :(得分:36)

即使某个类没有公开iterator方法,您仍然可以通过提供扩展函数for使用iterator语句对其进行迭代:

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

现在,当您在JSONArray语句中使用for时,将调用此扩展来获取迭代器。它创建一系列索引并将每个索引映射到与此索引对应的项目。

我认为需要转换为JSONObject,因为数组不仅可以包含对象,还可以包含基元和其他数组。 asSequence调用是以懒惰的方式执行map操作。

答案 2 :(得分:2)

怎么样

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

答案 3 :(得分:2)

最短的方法是:

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

基本上从零到jsonarray长度的范围内,每次取一个数字并将其用作检索当前对象的索引

答案 4 :(得分:0)

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