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




Ну по сути 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
Я пробовал: 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 должно быть строкой, коллекцией или массивом».
@ Гаятри, пожалуйста, см. Ответ
Вы можете использовать итератор для потокового преобразования:
Stream<String> stream= StreamSupport.stream(
arr.spliteratorUnknownSize(list.iterator(), Spliterator.ORDERED),
false);
Другим решением было бы использовать стандарт для реализации java - javax.json.JsonArray, который в основном представляет собой коллекцию и дает вам метод stream ()
Интернет-источники, которые я нашел, указывают на то, что
JSONArrayне реализует ни один из интерфейсов сбора. Что заставляет вас думать, что вы могли бы назвать егоstream()?