java 使用Jayway Jsonpath过滤对象元素

cwdobuhd  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(113)

我有一个jsonpaths的列表(不知何故“行为良好”),我必须返回一个只包含列表中描述的元素的对象。例如,给定列表["$.a.a2", $.c]和对象

{
    "a": {"a1": 1, "a2": 2},
    "b": foo,
    "c": []
}

期望的结果是

{
    "a": {"a2": 2},
    "c": []
}

我正在使用Jayway Jsonpath,但我愿意使用其他库。我目前的解决方案如下:

  • 找到描述同一组元素的最小jsonpath列表(即如果"$.a"存在,则移除"$.a.a2");
  • 确定叶子对象(在第一个例子中为a2c),并构建一个能够包含它们的Map,因为深度节点的创建仍然是not supported:在第一个例子中,在这一步之后,我创建了一个Map{"a": {}};
  • 从初始对象读取值,并使用提供的方法read/set将它们复制到Map中。

我很惊讶,这样的功能是不存在的。是否有更好的方法来过滤对象中的属性?Squiggly可能是一个合适的解决方案,但没有被维护。

2izufjch

2izufjch1#

您可以尝试另一个JSON库 * Josson *,使用查询表达式和函数map()
https://github.com/octomix/josson

Josson josson = Josson.fromJsonString(
    "{" +
    "    \"a\": {\"a1\": 1, \"a2\": 2}," +
    "    \"b\": \"foo\"," +
    "    \"c\": []" +
    "}");
JsonNode node = josson.getNode("map(a.map(a2), c)");
System.out.println(node.toPrettyString());
    • 输出**
{
  "a" : {
    "a2" : 2
  },
  "c" : [ ]
}

您可以将JSON输出的结构与这个重新格式化的查询表达式进行比较:

map(
  a.map(
    a2
  ),
  c
)

相关问题