当前位置: 首页 > 知识库问答 >
问题:

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

冷正青
2023-03-14

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

{
    <some fields...>,
    "results" : [
            {
                "name" : "name1",
                "data" : ...,
                "values" : 13
            }, 
            {
                "name" : "name2",
                "data" : ...,
                "values" : 20
            },
            .
            .
            .
            {
                "name" : "name_n",
                "data" : ...,
                "values" : 151
            }
        ]
}

在Java中:

ObjectMapper mapper = new ObjectMapper();
JsonNode results = mapper.readValue(rawJson, JsonNode.class).get("results");

如何通过过滤属性<code>name</code>来获得特定的JsonNode元素?如果我想得到<code>值</code>大于X的JsonNode元素,怎么样?我是否可以在不遍历<code>结果</code>变量的情况下完成这些操作?

共有1个答案

郑正文
2023-03-14

您可以使用java.lang.IterableforEach(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);
        }
    }

}
 类似资料:
  • 使用Jackson过滤掉属性非常简单: 我正在尝试将其集成到我的Jersey REST应用程序中。API用户可以通过提供查询字符串来过滤属性: 在泽西岛最优雅的方式是什么?我可以很容易地在我的资源方法中执行上述操作,但这不知何故破坏了Jersey的优雅。此外,我认为为每个请求创建一个新的ObjectMapper会导致性能下降。 我可以编写一个MessageBodyWriter,它从UriInfo上

  • 我对xslt有这个问题。样式表中有一个名为misctable的表,它被放在一个变量miscTables中。例如在节点 id="_384PLATE"具有值A1、A2、B1。当我标记并将其与xml进行比较时,我需要保存R[@i=2]/C/@i属性的值。在这种情况下,我需要得到值2,3,26 xml xslt 非常感谢。

  • 我想选择仅在顶级国家/地区之后或仅在其他国家/地区之后的span元素 我已经尝试了 如果我分别尝试这两种XPATH,它们都可以工作,但如果结合使用,它们就不起作用。 我只想选择排名靠前的国家,并将其列入一个列表:,然后过滤掉其他国家。 如果我使用[text()=“Top Countries”]//以下同胞::span所有国家都被选中。例如,<代码>[“澳大利亚”、“几内亚比绍”、“西班牙”、“瑞士

  • 我如何使用“insref”和“pref”对下面的元素进行分组,我在xslt版本1中使用了生成密钥id。 期望的结果: 这是我所拥有的。我也在使用密钥生成函数。任何想法这个xslt有什么问题。至于计数,我正在考虑获得唯一的密钥计数。

  • 我有一个使用Postgre 9.3和JPA2.1(Hibernate实现)的Spring MVC应用程序。我有一个类'电影',其中有一组评论。我想写一个JPA NamedQuery,它返回我所有的电影细节,但只有批准的评论。评论可以有其他状态,但我想只显示批准的评论。 我的班级如下所示: 我写的查询不会过滤评论并返回包含所有评论的电影;它的工作原理与上面显示的findMovieById查询相同。

  • 我使用jackson-dataformat-xml(2.9)将XML解析为JSONode,然后将其解析为JSON(XML是非常动态的,所以我使用JSONode而不是绑定到POJO。例如,“元素名”和“id”的名称可能不同)。 在JSON解析阶段,其中一个元素键是空字符串(“”)。 XML: JSON: 结果: 预期: 我的想法是无论何时找到空密钥“”,并用“值”替换它。无论是在XML反序列化还是在