我正在使用Jayway JSONPath。
给定一个JSON文档,其中的节点在不同的结构级别上具有相同的名称,我该如何仅选择那些终端节点的节点,即仅包含文本或不包含任何内容?
XPath不允许使用(child :: *)作为谓词,但我看不到JSONPath等效项。
答案 0 :(得分:0)
不幸的是,到目前为止,没有JSONPath实现提供这种操作。但是,在Goessner的参考文献中扩展的一些更高级的实现具有与此接近的操作。
一种解决方法是,如果可能的话,使用检查节点的类型。例如,可以在JavaScript JSONPath-Plus实现中使用JSON类型的类型选择器进行操作: @null()
,@boolean()
,@number()
,@string()
,@array()
,@object()
@integer()
等。例如,这允许我们仅获取数值:
$..*@number()
结合更有意义的路径选择,我们可能会更加接近。尽管如此,这不仅会产生终端值,而且至少会避免使用数组和对象类型属性。
适用于基本数据类型的另一种解决方法是使用相当多的实现(例如JayWays,许多JavaScript实现等)中可用的正则表达式匹配器来解释节点的类型,例如再说一次数值
$..[?(@.price =~ /[0-9]+\.?[0-9]*/)]
同样,这不会只为您提供终端值,而是避免使用数组和对象类型属性。