Jayway JSONPath:如何选择终端节点

时间:2020-02-06 09:47:28

标签: java json jsonpath

我正在使用Jayway JSONPath。

给定一个JSON文档,其中的节点在不同的结构级别上具有相同的名称,我该如何仅选择那些终端节点的节点,即仅包含文本或不包含任何内容?

XPath不允许使用(child :: *)作为谓词,但我看不到JSONPath等效项。

1 个答案:

答案 0 :(得分:0)

不幸的是,到目前为止,没有JSONPath实现提供这种操作。但是,在Goessner的参考文献中扩展的一些更高级的实现具有与此接近的操作。

一种解决方法是,如果可能的话,使用检查节点的类型。例如,可以在JavaScript JSONPath-Plus实现中使用JSON类型的类型选择器进行操作: @null()@boolean()@number()@string()@array()@object() @integer()等。例如,这允许我们仅获取数值:

$..*@number()

结合更有意义的路径选择,我们可能会更加接近。尽管如此,这不仅会产生终端值,而且至少会避免使用数组和对象类型属性。

适用于基本数据类型的另一种解决方法是使用相当多的实现(例如JayWays,许多JavaScript实现等)中可用的正则表达式匹配器来解释节点的类型,例如再说一次数值

$..[?(@.price =~ /[0-9]+\.?[0-9]*/)]

同样,这不会只为您提供终端值,而是避免使用数组和对象类型属性。