[android] Kotlin : JSONArray를 통해 반복

Kotlin과 Realm을 사용하여 Android 앱을 작성하고 있습니다. JSONArray가 있고 Realm 데이터베이스 클래스에로드하기 위해이 배열의 JSONObject를 반복하고 싶습니다.

영역 클래스 :

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오류가 발생합니다.



답변

불행히도 JsonArray반복자를 노출하지 않습니다. 따라서 인덱스 범위를 사용하여 반복해야합니다.

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

    // Your code here
}


답변

일부 클래스가 iterator메서드를 노출하지 않더라도 for확장 함수를 제공하여 문으로 반복 할 수 있습니다 iterator.

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

이제 JSONArrayin for문 을 사용할 때이 확장이 호출되어 반복자를 가져옵니다. 인덱스 범위를 만들고 각 인덱스를이 인덱스에 해당하는 항목에 매핑합니다.

JSONObject배열에는 객체뿐만 아니라 기본 요소 및 기타 배열도 포함될 수 있으므로 캐스트 가 필요하다고 생각합니다 . 그리고 게으른 방식으로 작업 asSequence을 실행하라는 호출이 여기에 map있습니다.

일반적인 방법 ( 모든 배열 항목이 동일한 유형 이라고 가정 )

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


답변

어때

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

?


답변

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


답변

가장 짧은 방법은 다음과 같습니다.

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

기본적으로 0에서 jsonarray 길이까지의 범위에서 한 번에 하나의 숫자를 취하고 현재 객체를 검색하는 인덱스로 사용합니다.


답변