Как сделать JSONArray рабочим в цикле for-each?

189
30 ноября 2018, 15:50

Интересно, как можно написать свой JSONArray, чтобы его JSONObject'ы можно было пробегать через цикл for-each?

Answer 1

В Java это сделать довольно просто:

Создать декоратор над JSONArray:

public class ExtendedJSONArray implements Iterable<JSONObject> {
    private final JSONArray jsonArray;
    public ExtendedJSONArray(JSONArray jsonArray) {
        this.jsonArray = jsonArray;
    }
    @Override
    public Iterator<JSONObject> iterator() {
        return new ExtendedJSONArrayIterator();
    }
    private class ExtendedJSONArrayIterator implements Iterator<JSONObject> {
        private int iterator;
        @Override
        public boolean hasNext() {
            return iterator < jsonArray.length();
        }
        @Override
        public JSONObject next() {
            JSONObject jsonObject = jsonArray.getJSONObject(iterator);
            iterator++;
            return jsonObject;
        }
        @Override
        public void remove() {
            jsonArray.remove(iterator);
        }
    }
}

Далее можно использовать так:

JSONArray jsonArray = new JSONArray();
jsonArray.put(new JSONObject("{\"a\":5,\"b\":10}"));
jsonArray.put(new JSONObject("{\"a\":15,\"b\":20}"));
jsonArray.put(new JSONObject("{\"a\":25,\"b\":30}"));
for (JSONObject jsonObject: new ExtendedJSONArray(jsonArray)) {
    System.out.println(jsonObject.toString(2));
}
Answer 2

На Kotlin проще всего JSONArray перевести в Array и гонять любыми циклами.

Либо так по индексу:

val jsonArray = JSONArray()
for (i in Array(jsonArray.length()) { i -> i }) {
    val item = jsonArray.getJSONObject(i)
    // ...
}

Либо так:

val jsonArray = JSONArray()
for (item in Array(jsonArray.length()) { i -> jsonArray.getJSONObject(i) }) {
    // ...
}

Соответсвенно, все функциональные примочки (forEach, filter, first, ...) тоже будут доступны.

READ ALSO
Обновление ListView , когда пользователь прокручивает его

Обновление ListView , когда пользователь прокручивает его

Необходимо постоянно обновлять список чатов в ListView и этот список пользователь может постоянно прокручиватьОбновление делаю в

167
Полетел каталог товаров wordpress

Полетел каталог товаров wordpress

Каталог товаров в магазине слетел каким то чудом и выдает что то вроде этого

161
Как выровнять тайтл (смотреть пример)

Как выровнять тайтл (смотреть пример)

Ребята, короче, такие дела уже по-моему задавал тут вопрос этотНе могу вертикально отцентровать элемент (в хроме норм, а в IE и firefox - нет )

217
Как выровнять элементы

Как выровнять элементы

Как выровнять элементы в строках? Дело в том, что заголовки разного размера и все плыветПоломал всю голову, кроме как переделать все в css grid - сделать...

165