下面是我的代码:
导入为: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
是未定义的。
我使用Java8。流用于列表。我在arr中获取键行的值。请说明为什么以及如何解决。
答案 0 :(得分: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}]
答案 1 :(得分:0)
您可以使用迭代器来进行流式转换:
Stream<String> stream= StreamSupport.stream(
arr.spliteratorUnknownSize(list.iterator(), Spliterator.ORDERED),
false);
另一种解决方案是使用Java实现标准-javax.json.JsonArray
基本上是一个集合,并为您提供stream()方法