是否有允许访问父节点并具有多选功能的 JSON 查询语言?



JSON 有很多查询语言,例如 JMES 路径和 JSON 路径,但我发现没有一种让我感兴趣,例如 JSON 路径不允许多选查询(我无法返回具有不同类型元素的列表 [汽车、飞机、船]),与 JSON 路径相比,JMES 路径确实更简单,并且允许多选但不允许访问父节点,如 .. 或 parent(@) 或 $(对于源)。 所以我想要一种可以同时做这两件事的语言,如果可能的话,一种简单的查询语言,如 JMES Path,但如果只有一个并且是最困难的,没关系,我会接受它!

PS:我用JavaScript工作!

jq是一种JSON查询语言,与JSONPath有些相似,但具有图灵完备编程语言的完全通用性。jq包含了所有的JSON,它的许多构造都是类似JSON的。对 JSON 数组的形成没有限制。

在 jq 中处理涉及"父"和"子"的问题的方法之一是使用 jq 路径,这些路径只不过是 JSON 数组,其所有元素都是 JSON 字符串(对应于键名)或整数(对应于数组中的索引)。 因此,如果$p是 JSON 文档的某个子组件的路径,则其父级的路径将是$p[:-1]

然而,在实践中,许多涉及父母和/或孩子的问题可以在不使用完整路径的情况下更容易解决。 特别要注意的是,to_entries可以与 JSON 对象和 JSON 数组一起使用。

资源

主网站包括教程、手册和 Wiki,其中包含常见问题解答、食谱、"语言描述"和 JSONPath 用户指南。

在stackoverflow上,目前有超过2000个带有jq标签的问题。另请参阅 http://rosettacode.org/wiki/Category:Jq

看看对象扫描。这似乎与你所问的内容有关,因为它提供了很大的灵活性和对许多节点元信息的访问,比如父母。自述文件中有更多示例,但这里有一个基本示例,可以为您提供一个想法

// const objectScan = require('object-scan');
const data = { a: { b: 'c' }, d: ['e', 'f'] };
const r = objectScan(['*.b', 'd[*]'], {
filterFn: ({ value }) => ['c', 'f'].includes(value)
})(data);
console.log(r);
// => [ [ 'd', 1 ], [ 'a', 'b' ] ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.7.1"></script>

免责声明:我是对象扫描的作者

最新更新