杰克逊支持Java 8的stream()吗?

16

我想在Java 8的流API中使用Jackson的树模型,就像这样:

JsonNode jn = new ObjectMapper().readValue(src, JsonNode.class);
return jn.stream().anyMatch(myPredicate);

然而,JsonNode似乎不实现stream()方法,而我也找不到任何标准的辅助方法来实现它。

JsonNode实现了Iterable接口,因此我可以使用Google Guava来实现相同的结果:

JsonNode jn = new ObjectMapper().readValue(src, JsonNode.class);
return Iterables.find(jn, myPredicate);

但是纯Java解决方案呢?


你真的不能在JSON图上使用Java流,即使你这样做,也必须限制为顺序流,即使如此,我也不确定它是否有多大意义。并行地,您可以让子节点在其父节点之前到达,有点奇怪。也许您正在考虑将转换为POJO的顶级对象列表进行流式处理。该问题似乎已在此处得到回答:https://dev59.com/pFwY5IYBdhLWcg3wYW5X - K.Nicholas
嘿,@karl-nicholas。我确实是指从节点(无论是对象还是数组)中读取序列。然而,这个问题涉及到Jackson Tree Model,与POJOs无关。被接受的答案正是我所需要的。 至于流式传输图形:JSON文档是一种非常特殊的图形(树),当然可以遍历,例如广度优先或深度优先。 - vitaly
当然,可以遍历树,但流式处理不应该是同一个对象吗?如果我流式处理树遍历,你会得到每个属性的不同对象,例如日期、整数、浮点数等。我知道所有东西都是JsonNode,但那只是一个包装类。如果你不关心节点中的内容,或者要对某些内容进行过滤,那么可能很方便。无论如何,我不知道你想做什么,所以不用担心,我只是在考虑一般情况下如何流式处理树结构的问题。很高兴你找到了你想要的答案。 - K.Nicholas
1个回答

51
JsonNode 实现了 Iterable 接口,因此它具有 spliterator() 方法。您可以使用该方法来进行迭代操作。
StreamSupport.stream(jn.spliterator(), false /* or whatever */);

获取一个Stream


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接