Невозможно передать массив JSON в потоковом режиме

Ниже мой код:

Импорт: org.json.JSONArray, org.json.JSONObject.

String x = "{\"count\":25,\"rows\":[{\"id\":10,\"name\":\"xxx\"},{\"id\":11,\"name\":\"xyx\"}]}";
JSONObject obj=new JSONObject(x);
JSONArray arr=obj.getJSONArray("rows");

Фактические данные содержат много записей со многими ключевыми значениями, которые мне нужно отфильтровать. Итак, я попробовал arr.stream(), но при самой компиляции он показывает, что метод stream() не определен для типа JSONArray.

Я использую java 8. потоки работают для списка. Я получаю значения ключевых строк в обр. Поясните, пожалуйста, почему и как это можно решить.

Интернет-источники, которые я нашел, указывают на то, что JSONArray не реализует ни один из интерфейсов сбора. Что заставляет вас думать, что вы могли бы назвать его stream()?

Thomas 05.11.2018 09:43
stackoverflow.com/questions/44595433/…
Gayathri 05.11.2018 09:44

Взгляните на пакеты. Вы используете org.json.JSONArray, в то время как опубликованная вами ссылка касается org.json.simple.JSONArray - обратите внимание на пакет simple, это означает совершенно другую библиотеку. Это похоже на исходный код используемого вами класса: docjar.com/docs/api/org/json/JSONArray.html

Thomas 05.11.2018 09:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
8 533
2

Ответы 2

Ну по сути org.json.JSONArray - это не массив как таковой. Это просто класс, представляющий массив JSON (да, звучит странно), то есть [].

Хорошая новость в том, что он реализует Iterable. Итак, вы можете получить такой поток:

String x = "{\"count\":25,\"rows\":[{\"id\":10,\"name\":\"xxx\"},
{\"id\":11,\"name\":\"xyx\"}]}";

JSONObject obj = new JSONObject(x);
JSONArray arr= obj.getJSONArray("rows");

StreamSupport.stream(arr.spliterator(), false)
  .forEach(System.out::println);

Из:

{"name":"xxx","id":10}
{"name":"xyx","id":11}

Редактировать 1 - ответ на комментарии

Код, который вы предоставили, мне подходит. Он фильтрует все объекты в массиве, кроме тех, которые имеют id==11:

List<JSONObject> list = StreamSupport.stream(arr.spliterator(), false)
            .map(val -> (JSONObject) val)
            .filter(val -> val.getInt("id") == 11)
            .collect(Collectors.toList());

System.out.println(list);

Из:

[{"name":"xyx","id":11}]

Не могли бы вы получить дополнительную помощь в том, как фильтровать и собирать на основе идентификатора, например, получать значения из строк, где идентификатор = 11

Gayathri 05.11.2018 11:19

Я пробовал: JSONArray cdvalues ​​= StreamSupport.stream (arrs.spliterator (), false) .map (val -> (JSONObject) val) .filter (val -> val.getInt ("id") == 11) .collect (Collectors.toList ()); Я не уверен, как собирать, и в большинстве случаев я не могу передать List <JSONObject> в JSONArray. если я приведу к списку <JSONObject>, он выдаст «Начальное значение JSONArray должно быть строкой, коллекцией или массивом».

Gayathri 05.11.2018 11:22

@ Гаятри, пожалуйста, см. Ответ

rxn1d 07.11.2018 02:57

Вы можете использовать итератор для потокового преобразования:

Stream<String> stream= StreamSupport.stream(
                  arr.spliteratorUnknownSize(list.iterator(), Spliterator.ORDERED),
                  false);

Другим решением было бы использовать стандарт для реализации java - javax.json.JsonArray, который в основном представляет собой коллекцию и дает вам метод stream ()

Другие вопросы по теме