2016-03-23 7 views
19

Я пишу приложение для Android, используя Kotlin и Realm. У меня есть JSONArray, и я хочу, чтобы перебирать JSONObjects в этом массиве, чтобы загрузить их в классе базы данных Realm:Kotlin: Итерация через JSONArray

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

} 

The 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.

+0

Эта библиотека JSON вы используете? – mfulton26

+0

Я использую 'org.json.JSONArray' и' org.json.JSONObject'. – Ambran

ответ

27

К сожалению, JsonArray не предоставляет итератор. Таким образом, вам придется итерацию через него, используя диапазон индексов:

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

    // Your code here 
} 
+5

Nicer is: for (i in 0 until persons.length()) –

27

Даже если какой-то класс не разоблачить iterator метод, вы можете перебирать его for заявление, предоставляя функцию расширения iterator:

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

Теперь, когда вы используете JSONArray в сообщении for, это расширение вызывается для получения итератора. Он создает ряд индексов и сопоставляет каждый индекс с элементом, соответствующим этому индексу.

Я полагаю, что приведение к JSONObject требуется, так как массив может содержать не только объекты, но также примитивы и другие массивы. И вызов asSequence здесь выполнен, чтобы выполнить операцию map ленивым способом.

+1

Спасибо Илье. Как новичок Kotlin, я ценю каждый вход, который я могу получить. – Ambran

+0

Я предпочитаю это решение, так как он имеет большее преимущество в специфической функциональности Kotlin. –

+0

Хотя, конечно, у вас не всегда будет массив JSONObject. Вы можете попробовать: 'operator fun JSONArray.iterator(): Iterator = (0 до length()). AsSequence(). Map {get (it) as T} .iterator()' теперь он имеет Конечно, неконтролируемый актерский состав. – user3175580

Смежные вопросы