无法流JSON数组

时间:2018-11-05 08:36:53

标签: java 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是未定义的。

我使用Java8。流用于列表。我在arr中获取键行的值。请说明为什么以及如何解决。

2 个答案:

答案 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()方法