Kotlin:通过JSONArray迭代

Amb*_*ran 55 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() {

}
Run Code Online (Sandbox Code Playgroud)

JSONArray:

{
    "persons":[
        {
           "id":0,
           "name":"Biatrix"
        },
        {
           "id":1,
           "name":"Bill"
        },
        {
           "id":2,
           "name":"Oren"
        },
        {
           "id":3,
           "name":"Budd"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我试过迭代如下:

for (item : JSONObject in persons) {

}
Run Code Online (Sandbox Code Playgroud)

......但是我收到了for-loop range must have an iterator() method错误.

0x6*_*x60 103

不幸的是,JsonArray不暴露迭代器.所以你必须使用索引范围迭代它:

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

    // Your code here
}
Run Code Online (Sandbox Code Playgroud)

  • 尼尔是:for(我在0中直到persons.length()) (35认同)
  • `for(i在0之前直到person.length()`)绝对更好,因为它似乎有助于避免可怕的一次性问题。但是为什么不公开迭代器呢?默认情况下,这似乎很疯狂...这是一个核心对象类型,完全专注于多个对象。迭代似乎很自然,对吧??? (6认同)

Ily*_*lya 38

即使某个类没有公开iterator方法,您仍然可以for通过提供扩展函数来使用statement 迭代它iterator:

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

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

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

  • 谢谢伊利亚.作为一个Kotlin新手我欣赏我能得到的每一个输入. (3认同)
  • 当然,您不会总是拥有 JSONObject 数组。你可能想试试:`operator fun &lt;T&gt; JSONArray.iterator(): Iterator&lt;T&gt; = (0 until length()).asSequence().map { get(it) as T }.iterator()` now当然,它有一个“未经检查的演员表”。 (2认同)
  • @Sevastyan 您可以使用 https://try.kotlinlang.org 快速检查“0 到 0”的计算结果 (2认同)

Sha*_*rif 6

怎么样

(0..(jsonArray.length()-1)).forEach { i ->
    var item = jsonArray.getJSONObject(i)
}
Run Code Online (Sandbox Code Playgroud)