目录
让我们安装groq
让我们进行一些练习热身
查询诺贝尔奖获得者
更多练习!
使用过滤器
更多的练习!
使用预测
练习
一次做更多
概括
锻炼答案
问题3
首页 web前端 css教程 查询终端中的JSON文档与GROQ

查询终端中的JSON文档与GROQ

Apr 14, 2025 am 09:40 AM

查询终端中的JSON文档与GROQ

今天到处都有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”属性。

让我们进行一些练习热身

您可能认为您不需要锻炼才能完成这篇文章!好吧,好消息是,我们只在详细介绍更多细节之前,我们只用一些事情来锻炼头脑。

  1. 如果您删除[完整== true]和/或{title,userId},会发生什么?
  2. 您如何更改查询以查找用户ID 2的用户所有Todos?
  3. 您如何更改查询以找到用户ID为2的用户未完成的戒酒?
  4. 如果原始查询示例中的过滤器与投影交换,会发生什么?
  5. 您将如何编写一个单个命令(带管道)下载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. 写一个查询,以查找您自己国家的所有诺贝尔奖获得者。
  2. 写一个查询以返回最后的挪威获奖者。提示:-1指的是最后一项。
  3. 如果您尝试直接在根对象上过滤会发生什么? *[borncountrycode ==“否”]?
  4. *。

像上次一样,答案将在这篇文章的结尾处。

使用过滤器

现在我们知道,总共有12个挪威诺贝尔奖获得者,其中有多少人在1950年之后出生?弄清Groq没问题:

 $ cat Laureate.json | groq'*.laureates [borncountrycode ==“ no” && bort> =“ 1950-01-01”] {firstName}' -  pretty

//样本返回
[
  {
    “ firstName”:“ May-Britt”
  },,
  {
    “ firstName”:“ Edvard I.”
  }
这是给出的
登录后复制

实际上,Groq拥有一组丰富的操作员,我们可以在过滤器中使用。我们可以比较(==),不等于(!=),大于(>),大于或等于(> =),小于(

更多的练习!

您知道钻头:尝试使用过滤器玩一些,以了解它们如何与数据集使用。当然,答案是最后的。

  1. 编写一个返回带有获奖者的查询。
  2. 过滤器[borncountrycode ==“ no”] [born> =“ 1950-01-01”]
  3. 您能找到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,

练习

希望此时您对事情有很好的感觉,但是这里还有一些练习预测工作的方法:

  1. 找到所有赢得两个或更多奖项的获奖者。
  2. 找到女性赢得了多少奖。
  3. 格式化一个将结果名称和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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1653
14
CakePHP 教程
1413
52
Laravel 教程
1305
25
PHP教程
1251
29
C# 教程
1224
24
带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

如何使用HTML,CSS和JavaScript创建动画倒计时计时器 如何使用HTML,CSS和JavaScript创建动画倒计时计时器 Apr 11, 2025 am 11:29 AM

您是否曾经在项目上需要一个倒计时计时器?对于这样的东西,可以自然访问插件,但实际上更多

HTML数据属性指南 HTML数据属性指南 Apr 11, 2025 am 11:50 AM

您想了解的有关HTML,CSS和JavaScript中数据属性的所有信息。

如何通过CSS选择第一个类名为item的子元素? 如何通过CSS选择第一个类名为item的子元素? Apr 05, 2025 pm 11:24 PM

在元素个数不固定的情况下如何通过CSS选择第一个指定类名的子元素在处理HTML结构时,常常会遇到元素个数不�...

为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? 为什么Flex布局中的紫色斜线区域会被误认为是'溢出空间”? Apr 05, 2025 pm 05:51 PM

关于Flex布局中紫色斜线区域的疑问在使用Flex布局时,你可能会遇到一些令人困惑的现象,比如在开发者工具(d...

使Sass更快的概念证明 使Sass更快的概念证明 Apr 16, 2025 am 10:38 AM

在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? 在前端开发中,如何使用CSS和JavaScript实现类似Windows 10设置界面的探照灯效果? Apr 05, 2025 pm 10:21 PM

在前端开发中如何实现类似Windows...

See all articles