为了账号安全,请及时绑定邮箱和手机立即绑定

无法流式传输 JSON 数组

无法流式传输 JSON 数组

米琪卡哇伊 2021-12-30 17:20:16
下面是我的代码:导入是:org.json.JSONArray, org.json.JSONObjectString 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()未定义为 type JSONArray。我使用 java 8.流工作列表。我正在获取 arr 中关键行的值。请说明原因以及如何解决。
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

那么基本上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}]


查看完整回答
反对 回复 2021-12-30
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

您可以使用迭代器进行流转换:

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

另一种解决方案是使用 java 实现的标准 -javax.json.JsonArray它基本上是一个集合并为您提供一个 stream() 方法


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信