今天到处都有JSON文档,但是它们很少像您想要的那样结构。它们通常包含过多的数据,具有怪异命名的字段,或将数据放在不必要的嵌套对象中。图形相关对象查询(GROQ)是一种查询语言(例如SQL,但不同),旨在直接在JSON文档上使用。它基本上使您可以编写可以快速过滤的查询,然后重新格式化JSON文档,以使其成为最方便的形状。
GROQ是由Sanity.io(用作主要查询语言)开发的。它是开源的,它为我们提供了内置的方式,可以在任何JSON源上使用JavaScript和命令行中使用它。我们一起将GROQ添加到终端工具包中,每当您需要将一些JSON数据争吵时,这将节省您的时间。
让我们安装groq
像大多数事情一样,我们需要安装GROQ CLI工具,并可以使用终端中的NPM(或YARN)进行操作:
$ npm install -G groq -cli
为了使用它,我们需要有一个JSON文件。我们将使用Curl下载todo数据的示例数据集:
$ curl -o todos.json https://jsonplaceholder.typicode.com/todos
让我们快速查看数据中的示例项目:
{ “用户ID”:1, “ id”:1, “ title”:“ dlectus aut autem”, “完成”:false },,
非常简单。我们有一个用户ID,一个待办事项ID,一个待办事项标题和一个布尔值,指定待办事项是否已完成。
现在,让我们运行一个基本的groq查询:查找所有已完成的戒酒,但仅返回TODO标题和用户ID。可以复制/粘贴这一行,因为我们会稍微浏览它的意思。
$ cat todos.json | groq'*[完整== true] {title,userId}' - pretty
GROQ命令行工具接受标准输入的JSON文档。这与“做一件事并在文本流一起工作”的Unix哲学非常有效。为了从文件中读取JSON,我们将使用CAT命令。另请注意,GROQ默认情况下将在一条线上输出最小的JSON,但是通过传递,我们获得了一个很好的缩进和突出显示的语法。
为了存储结果,我们可以使用>:
$ cat todos.json | groq'*[postate == true] {title,userId}'> result.json
查询本身由三个部分组成:
- *指数据集(即JSON文件中的数据)。
- [已完成== true]是一个滤镜,它删除了标记为不完整的项目。
- {title,userId}是一个投影,它导致查询仅返回“ title”和“ userId”属性。
让我们进行一些练习热身
您可能认为您不需要锻炼才能完成这篇文章!好吧,好消息是,我们只在详细介绍更多细节之前,我们只用一些事情来锻炼头脑。
- 如果您删除[完整== true]和/或{title,userId},会发生什么?
- 您如何更改查询以查找用户ID 2的用户所有Todos?
- 您如何更改查询以找到用户ID为2的用户未完成的戒酒?
- 如果原始查询示例中的过滤器与投影交换,会发生什么?
- 您将如何编写一个单个命令(带管道)下载JSON并使用GROQ处理的命令?
我们将答案放在帖子的结尾,供您参考。
查询诺贝尔奖获得者
TODO数据非常适合进行热身,但是说实话:看看使用拉丁语作为占位符内容的列表不是很有动力。但是,诺贝尔奖拥有所有过去的获奖者的数据集,可公开使用。
这是样本返回:
{ “获奖者”:[ { “ id”:“ 1”, “ firstName”:“ Wilhelm Conrad”, “姓”:“röntgen”, “天生”:“ 1845-03-27”, “死”:“ 1923-02-10”, “ borncountry”:“普鲁士(现在是德国)”, “ borncountrycode”:“ de”, “ BornCity”:“ Lennep(现在是Remscheid)”, “二岁”:“德国”, “ DIDCOUNTRYCODE”:“ DE”, “二岁”:“慕尼黑”, “性别”:“男性”, “奖品”:[...], },, // ... 这是给出的 }
啊!这更有趣!让我们下载数据集并找到所有挪威获奖者的名字。在这里,我们将使用 - 输出标志进行卷曲以将数据保存到文件。
$ curl -输出劳埃特(Laureate.json) $ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no”] {firstName}'-pretty
你回来什么?我收到了12个挪威诺贝尔奖获得者。不错!
请注意,此查询不像我们写的第一个查询。我们在这个中有一个额外的.laureates。当我们在TODO数据集中使用 *时,它代表了整个JSON文档,该文档包含在TODO数据集的顶级阵列中。另一方面,获奖文件在顶级列表中存储在“获奖者”属性中的顶级对象。
要访问特定项目,我们可以使用过滤器[0]并仅返回名字。应该告诉我们谁是挪威人是谁赢得诺贝尔奖。
$ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no”] {firstName} [0]' - pretty //返回的对象 { “ firstName”:“ ivar” }
更多练习!
我们将不愿意使用此新数据集来查看查询的工作原理。
- 写一个查询,以查找您自己国家的所有诺贝尔奖获得者。
- 写一个查询以返回最后的挪威获奖者。提示:-1指的是最后一项。
- 如果您尝试直接在根对象上过滤会发生什么? *[borncountrycode ==“否”]?
- *。
像上次一样,答案将在这篇文章的结尾处。
使用过滤器
现在我们知道,总共有12个挪威诺贝尔奖获得者,其中有多少人在1950年之后出生?弄清Groq没问题:
$ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no” && bort> =“ 1950-01-01”] {firstName}' - pretty //样本返回 [ { “ firstName”:“ May-Britt” },, { “ firstName”:“ Edvard I.” } 这是给出的
实际上,Groq拥有一组丰富的操作员,我们可以在过滤器中使用。我们可以比较(==),不等于(!=),大于(>),大于或等于(> =),小于(
更多的练习!
您知道钻头:尝试使用过滤器玩一些,以了解它们如何与数据集使用。当然,答案是最后的。
- 编写一个返回带有获奖者的查询。
- 过滤器[borncountrycode ==“ no”] [born> =“ 1950-01-01”]
- 您能找到1973年赢得奖金的所有获奖者吗?
使用预测
诺贝尔奖数据集将每个获奖者的名字和姓氏分开,但是如果我们想将它们结合在一起成一个领域,该怎么办? Groq中的预测可以做到这一点!
*。 “名称”:firstName“”姓氏, 出生, “ prizecount”:count(奖品), }
运行此查询告诉我们,May-Britt Moser和Edvard Moser获得了一个奖项(实际上是同一奖项):
[ { “名称”:“ May-Britt Moser”, “天生”:“ 1963-01-04”, “ prizecount”:1 },, { “名称”:“ Edvard I. Moser”, “天生”:“ 1962-04-27”, “ prizecount”:1 } 这是给出的
这里发生了什么?好吧,当我们在groq中撰写投影时,我们真正写的是一个JSON对象。以前,我们有简单的投影(例如{firstName}),但这是写入{“ firstName”:firstName}的快捷方式。通过使用扩展的对象语法,我们可以重命名键并转换值。
GROQ具有一组丰富的运算符和用于转换数据的功能,包括字符串串联,算术运算符( - , *, *, /,%,**),计数数组(count(count(prizes))和圆形数字(round(num,num,
练习
希望此时您对事情有很好的感觉,但是这里还有一些练习预测工作的方法:
- 找到所有赢得两个或更多奖项的获奖者。
- 找到女性赢得了多少奖。
- 格式化一个将结果名称和firstName组合在结果中的fullname键。
一次做更多
观看以下内容:
$ cat Laureate.json | groq -pretty' { “计数”:count(*。获奖), “挪威人”: *。 } '
结果:
{ “计数”:928, “挪威人”:[ { “ firstName”:“ ivar” },, { “ firstName”:“ lars” },, … 这是给出的 }
抓到吗? GROQ查询不必从 *开始。在此查询中,我们正在创建一个JSON对象,其中值是由单独的查询产生的。这为我们使用GROQ产生的东西提供了很大的灵活性。也许您希望戒酒的总数以及最后五个列表的列表。或者,也许您想将招待员分为两个单独的列表:一个用于完成,一个用于不完整。或者,也许您需要将所有内容包装在对象中,因为这是另一个工具/库/框架所期望的。无论如何,Groq都可以覆盖。
让我们尝试最后一个练习。您可以投影一个获奖者包含一个阵列的对象,其中每个获奖者已经运行的奖品总数的圆形百分比,并返回了获奖者的名字?然后,尝试输出分发出的总数。
概括
在从GROQ中获得一些充分利用之前,您不需要学习太多。如果您遵循了练习,那么您将成为成为Groq Guru的好途径。自然,此介绍不会涉及GROQ的所有不同功能和方面,因此请随时在Github上探索规范和项目本身。如果您对Groq的数据争吵有疑问,请随时与Sanity.io接触。
锻炼答案
练习1
问题1
如果您删除[已完成== true],您将获得所有戒酒,而不仅仅是完成的戒酒。如果删除{title,userId},则将获得所有属性。
问题2
*[userId == 2]
问题3
*[userId == 2 &&完成== false]或 *[userId == 2 &&!已完成]
问题4
如果更改过滤器的顺序和投影,则将首先进行投影,然后应用过滤器。这意味着您要过滤在仅包含标题和用户ID的Todos列表中,并且已完成== True永远是不正确的。
问题5
curl https://jsonplaceholder.typicode.com/todos | groq'*[postate == true] {title,userId}'> result.json
练习2
问题1
*。
问题2
*。
问题3
*[borncountrycode ==“否”]将尝试在对象上过滤。这没有任何意义,因此您将获得无效的答案。
问题4
*.laureates \ [0 \] [borncountrycode ==“ no”]无法正常工作。这将首先找到第一个获奖者(恰好是Wilhelm Conrad),然后尝试“过滤”对象。这是没有意义的,因此答案是无效的。
练习3
问题1
*。
问题2
过滤器\ [borncountrycode ==“ no” \] [born> =“ 1950-01-01”]第一个在两个“通过”中进行过滤,但最终结果是相同的。
问题3
*.laureates [“ 1973”奖品[]
练习4
问题1
*.laureates [count(奖品)> = 2]
问题2
计数(*。获奖[性别==“女性”])
问题3
*.laureates {“ fullname”:surname“,” firstName}
练习5
*.laureates {“获奖者”:{firstName,“百分比”:round(count(count(prizes) / count(*。获奖[]。
以上是查询终端中的JSON文档与GROQ的详细内容。更多信息请关注PHP中文网其他相关文章!

我最近找到了一种动态更新任何产品图像的颜色的解决方案。因此,只有一种产品之一,我们可以以不同的方式对其进行着色以显示

在本周的综述中,灯塔在第三方脚本上阐明了灯光,不安全的资源将在安全站点上被阻止,许多国家连接速度

有很多分析平台可帮助您跟踪网站上的访问者和使用数据。也许最著名的是Google Analytics(广泛使用)

文档负责人可能不是网站上最迷人的部分,但是其中所处的内容对于您的网站的成功也一样重要

当您看到一些称为super()的JavaScript时,在子类中,您会使用super()调用其父母的构造函数和超级。访问它的


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3汉化版
中文版,非常好用

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),