是否有等效于 XQuery/XPath 的 JSON?

IT技术 javascript json xpath xquery
2021-01-31 00:59:41

在复杂的 JSON 数组和散列中搜索项目时,例如:

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

是否有某种查询语言可以用来查找项目in [0].objects where id = 3

6个回答

是的,它叫做JSONPath

它还集成到DOJO 中

此处链接的站点提供 Javascript 和 PHP。如果您需要 Java 实现,这里有一个:code.google.com/p/json-path
2021-03-16 00:59:41
我应该提到 JSONPath 不是基于 XPath 形式语义的。JSONiq 可能是更好的选择。
2021-03-23 00:59:41
@Paramaeleon 效果很好。顺便说一下,该项目已迁移到 GitHub迈克可能想将此添加到答案中,因为人们不断对此发表评论。
2021-03-28 00:59:41
Brian 的回答表明应该使用jsonQuery module而不是dojo 中的 jsonPath module。
2021-04-01 00:59:41
这有多结实?而且我找不到对我们来说是交易杀手的 Java 或 C# 版本。
2021-04-03 00:59:41

JMESPath是一个相当成熟的库,具有详细的规范并支持多种语言。

语法示例:
// Select a single item
people[1].firstName

// Select a slice of an array
people[0:5]

// Select all the first names
people[*].firstName

// Select all first names based on search term
people[?state=='VA'].firstName

// Count how many people are over 35
length(people[?age>`35`])

// Select only the name and age of people over 35
people[?age>`35`].{name: name, age: age}

// Join expressions together to sort and join elements into a string
people[?state == 'WA'].name | sort(@) | join(', ', @)

您可以在文档中使用更多现场示例

JS 库被缩小了 19kb,所以可能比一些大,但考虑到广泛的功能,你可能会发现它是值得的。

其他选项

还有一些其他选项可用于遍历/过滤 JSON 数据,以及一些语法示例可帮助您比较...

  • JS路径
    .automobiles{.maker === "Honda" && .year > 2009}.model

  • json:select()(更多地受到 CSS 选择器的启发)
    .automobiles .maker:val("Honda") .model

  • JSONPath(更多地受到 XPath 的启发)
    $.automobiles[?(@.maker='Honda')].model

很好的总结和示例,也是因为提到了在 CSS 选择器或 XPath 中找到的灵感。
2021-04-09 00:59:41

我认为 JSONQuery 是 JSONPath 的超集,因此在 dojo 中替换了它然后还有RQL

从 Dojo 文档:

JSONQuery 是 JSONPath 的扩展版本,具有安全性、易用性和一套全面的数据查询工具的附加功能,包括过滤、递归搜索、排序、映射、范围选择以及具有通配符字符串比较和各种运算符的灵活表达式。

JSONselect对这个问题有另一个观点(类似 CSS 选择器,而不是 XPath)并且有一个JavaScript 实现

github JSONQuery 链接似乎已死。JSONSelect 现在也有一个 JavaScript 版本。
2021-04-10 00:59:41

我知道的其他选择是

  1. JSONiq规范,它指定了两种语言子类型:一种隐藏 XML 细节并提供类似 JS 的语法,另一种使用 JSON 构造函数等丰富 XQuery 语法。Zorba实现了 JSONiq。
  2. Corona构建在 MarkLogic 之上,提供了一个用于存储、管理和搜索 XML、JSON、文本和二进制内容的 REST 接口。
  3. MarkLogic 6 及更高版本提供了与 Corona 类似的开箱即用的 REST 接口。
  4. MarkLogic 8 及更高版本在其 XQuery 和服务器端 JavaScript 环境中原生支持 JSON。您可以在其上应用 XPath。

哈。

现在有一个 JSONiq 实现:Zorba 2.6 正式支持它。
2021-03-24 00:59:41
注意:从版本 8 开始,MarkLogic 本地存储 JSON,并允许直接在其上应用 XPath。
2021-03-24 00:59:41

尝试使用JSPath

JSPath 是一种域特定语言 (DSL),使您能够在 JSON 文档中导航和查找数据。使用 JSPath,您可以选择 JSON 项以检索它们包含的数据。

JSON 的 JSPath 就像 XML 的 XPath。

它针对 Node.js 和现代浏览器进行了大量优化。