Java 过滤Jackson';基于属性值的JsonNode元素

Java 过滤Jackson';基于属性值的JsonNode元素,java,json,jackson,Java,Json,Jackson,我正在使用Jackson的JsonNode解析json。我的json结构如下所示(设为变量rawJson): 如何通过过滤属性name,获得特定的JsonNode元素?如果我想获取值大于X的JsonNode元素,怎么样?我可以在不循环使用结果变量的情况下完成这些操作吗?您可以使用java.lang.Iterable的forEach(Consumer c)(JDK 1.8+)函数来执行列表迭代。此方法采用一个消费者实例,该实例处理列表中的所有值。此方法可以扩展为在迭代时使用过滤器,如下所示: pu

我正在使用Jackson的JsonNode解析json。我的json结构如下所示(设为变量rawJson):

如何通过过滤属性
name
,获得特定的JsonNode元素?如果我想获取
值大于X的JsonNode元素,怎么样?我可以在不循环使用
结果
变量的情况下完成这些操作吗?

您可以使用
java.lang.Iterable的
forEach(Consumer c)
(JDK 1.8+)函数来执行列表迭代。此方法采用一个
消费者
实例,该实例处理列表中的所有值。此方法可以扩展为在迭代时使用过滤器,如下所示:

public static void main(String[] args) {

    ObjectMapper om = new ObjectMapper();
    InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.json");
    try {
        JsonNode node = om.readValue(in, JsonNode.class).get("results");
        NodeFilteringConsumer consumer = new NodeFilteringConsumer(new NodeFilter() {

            @Override
            public boolean apply(JsonNode node) {
                //Filter for node with values greater than 20.
                return node.get("values").asDouble() > 20;
            }
        });

        node.forEach(consumer);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static interface NodeFilter{

    boolean apply(JsonNode node);
}

public static class NodeFilteringConsumer implements Consumer<JsonNode>{

    private NodeFilter f;

    public NodeFilteringConsumer(NodeFilter f) {
        this.f = f;
    }


    @Override
    public void accept(JsonNode t) {
        if (f.apply(t)){
            //Only filtered records reach here
            System.out.println("Filter applied on node:" + t);
        }
    }

}
publicstaticvoidmain(字符串[]args){
ObjectMapper om=新的ObjectMapper();
InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream(“test.json”);
试一试{
JsonNode node=om.readValue(in,JsonNode.class).get(“结果”);
NodeFilteringConsumer=新的NodeFilteringConsumer(新的NodeFilter(){
@凌驾
公共布尔应用(JsonNode节点){
//筛选值大于20的节点。
返回node.get(“values”).asDouble()>20;
}
});
节点forEach(消费者);
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态接口NodeFilter{
布尔应用(JsonNode);
}
公共静态类NodeFilteringConsumer实现使用者{
专用节点过滤器f;
公共NodeFilteringConsumer(NodeFilter f){
这个。f=f;
}
@凌驾
公共void接受(JsonNode t){
如果(f.适用(t)){
//只有经过过滤的记录才能到达这里
System.out.println(“应用于节点:+t的过滤器”);
}
}
}

目前我仅限于使用Java 7。在这种情况下,我认为您必须为每个循环编写一个for循环,以迭代结果的所有JSONNode。您可以在for循环内重复使用NodeFilter接口。此解决方案不会阻止Jackson解析整个负载。也许这正是OP想要的,所以不是说这是一个糟糕的答案,而是我实际上在寻找“当某个条件不成立时如何跳过数据的实际解析”(这对于大型JSON文件特别有用)
ObjectMapper mapper = new ObjectMapper();
JsonNode results = mapper.readValue(rawJson, JsonNode.class).get("results");
public static void main(String[] args) {

    ObjectMapper om = new ObjectMapper();
    InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.json");
    try {
        JsonNode node = om.readValue(in, JsonNode.class).get("results");
        NodeFilteringConsumer consumer = new NodeFilteringConsumer(new NodeFilter() {

            @Override
            public boolean apply(JsonNode node) {
                //Filter for node with values greater than 20.
                return node.get("values").asDouble() > 20;
            }
        });

        node.forEach(consumer);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static interface NodeFilter{

    boolean apply(JsonNode node);
}

public static class NodeFilteringConsumer implements Consumer<JsonNode>{

    private NodeFilter f;

    public NodeFilteringConsumer(NodeFilter f) {
        this.f = f;
    }


    @Override
    public void accept(JsonNode t) {
        if (f.apply(t)){
            //Only filtered records reach here
            System.out.println("Filter applied on node:" + t);
        }
    }

}