100 种语言速通:第 25 集:JQ

Q神日志 2023-06-25 09:40:48

JSON 实际上实现了 XML 承诺的功能,并成为一种近乎通用的数据交换格式。

每种编程语言都可以很好地处理 JSON,但有时您不想编写整个程序 - 您宁愿只编写一个 shell 单行代码,就像您可以使用的那样grepjq就是这么做的。

jq主要用于命令行或作为 shell 脚本,但出于本集的目的,我们还将检查它如何编写简短的独立程序(然后从 shell 调用)。

漂亮的印刷

jq默认情况下漂亮地打印其输出 - 如果输出是终端,也会对其进行颜色编码。.指整个输入文档。

所以这个单字母jq程序已经在做一些有用的事情了:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ echo '{"name": "Alice", "surname": "Smith"}' | jq .
{
  "name": "Alice",
  "surname": "Smith"
}
</code></span></span>

 

Web 开发的一个非常常见的模式是curl从某个 Web API 获取某些内容,然后| jq .查看它的打印效果。

你好世界!

让我们写一些实际的脚本。

您可以将最有效的 JSON 作为jq代码,该部分将被打印出来。.name相当于"name".JSON 的顶层获取字段。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ echo '<span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-text-color)">"name"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"Alice"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">"surname"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"Smith"</span><span style="color:var(--syntax-text-color)">}</span>' | jq '<span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-text-color)">"hello"</span><span style="color:var(--syntax-text-color)">:</span> .name<span style="color:var(--syntax-text-color)">}</span>'
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"hello"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"Alice"</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>

 

还需要JQ吗?

在我们对 JQ 进行任何操作之前,让我们回答一个简单的问题 - 我们是否需要它。Ruby 和 Perl 是可用于 shell 单行的两种最接近的通用编程语言。

如果我们将这个例子翻译成 Ruby,它将是:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ <span style="color:var(--syntax-text-color)">echo</span> <span style="color:var(--syntax-string-color)">'{"name": "Alice", "surname": "Smith"}'</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-text-color)">ruby</span> <span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-text-color)">rjson</span> <span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-text-color)">e</span> <span style="color:var(--syntax-string-color)">'data=JSON.parse(STDIN.read); puts JSON.pretty_generate(hello: data["name"])'</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-string-color)">"hello"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"Alice"</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>

 

或者在 Perl 中:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ <span style="color:var(--syntax-text-color)">echo</span> <span style="color:var(--syntax-text-color)">'</span><span style="color:var(--syntax-string-color)">{"name": "Alice", "surname": "Smith"}</span><span style="color:var(--syntax-text-color)">'</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-text-color)">perl</span> <span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-text-color)">e</span> <span style="color:var(--syntax-text-color)">'</span><span style="color:var(--syntax-string-color)">use JSON; $_=decode_json(<>); print JSON->new->ascii->pretty->encode({"hello"=>$_->{"name"}})</span><span style="color:var(--syntax-text-color)">'</span>
<span style="color:var(--syntax-text-color)">{</span>
   <span style="color:var(--syntax-text-color)">"</span><span style="color:var(--syntax-string-color)">hello</span><span style="color:var(--syntax-text-color)">"</span> <span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">"</span><span style="color:var(--syntax-string-color)">Alice</span><span style="color:var(--syntax-text-color)">"</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>

 

这些并不可怕,但它是大量的样板文件。如果我们跳过漂亮的打印,它们会更加简洁。到目前为止,jq 做得非常好。

还需要JQ吗?真的喜欢吗?

但是等等,如果我们将所有样板代码放入脚本中会怎样?让我们为 Ruby 制作一个超短的包装器并将其命名为rq。它只是加载 JSON,评估您在命令行上传递的 ruby​​ 代码,然后漂亮地打印结果:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)">#!/usr/bin/env ruby</span>

<span style="color:var(--syntax-text-color)">require</span> <span style="color:var(--syntax-string-color)">"json"</span>

<span style="color:var(--syntax-text-color)">$_</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-declaration-color)">JSON</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">parse</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">STDIN</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">read</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">$_</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">eval</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">ARGV</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">])</span>
<span style="color:var(--syntax-text-color)">puts</span> <span style="color:var(--syntax-declaration-color)">JSON</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-name-color)">pretty_generate</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">$_</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

 

当然,如果我们制作一个真正的脚本,我们会添加一些命令行选项来打开或关闭漂亮的打印、为输出着色等等。但我们只是在这里探讨这个问题,而不是编写生产代码。

那么现在呢?

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ <span style="color:var(--syntax-text-color)">echo</span> <span style="color:var(--syntax-string-color)">'{"name": "Alice", "surname": "Smith"}'</span> <span style="color:var(--syntax-error-color)">|</span> <span style="color:var(--syntax-text-color)">rq</span> <span style="color:var(--syntax-string-color)">'{hello: $_["name"]}'</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-string-color)">"hello"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"Alice"</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>

 

该死,这真的和 jq 很有竞争力,而且 jq 是一种比 JSON 早十年的语言!我不认为 Ruby 在 JSON 处理方面不如 jq,但它显示了了解像 Ruby(或大多数时候是 Python - 但在本例中不是那么多)这样的顶级语言可以给你带来多大的力量。

猫的事实

到目前为止,我的意思是jq获取 JSON 文档作为输入,在其上运行其代码,然后生成 JSON 文档作为输出。这不太准确。它实际上做的是获取任意数量的 JSON 文档,然后在每个文档上运行代码,然后输出所有结果。

JSON 文档是自闭合的,因此您可以连接任意数量的文档。这种“JSON 流”非常常见,通常此类系统每行都有一个 JSON 文档,但这不是 jq 强制执行的 - 它会接受以任何方式生成的 JSON。

那么让我们尝试一些关于猫的事实。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ curl -s 'https://cat-fact.herokuapp.com/facts' | jq '.<span style="color:var(--syntax-text-color)">[]</span>` | jq '.text'
<span style="color:var(--syntax-string-color)">"Cats make about 100 different sounds. Dogs make only about 10."</span>
<span style="color:var(--syntax-string-color)">"Domestic cats spend about 70 percent of the day sleeping and 15 percent of the day grooming."</span>
<span style="color:var(--syntax-string-color)">"I don't know anything about cats."</span>
<span style="color:var(--syntax-string-color)">"The technical term for a cat’s hairball is a bezoar."</span>
<span style="color:var(--syntax-string-color)">"Cats are the most popular pet in the United States: There are 88 million pet cats and 74 million dogs."</span>
</code></span></span>

 

Cat Facts API 返回一个包含 5 个对象的数组(您可以在此处查看)。

jq .[]获取每个文档并.[]对其进行运行。.[]将每个顶级值(数组或对象)打印为其自己的文档。

jq .text获取每个文档并.text对其进行运行。.text仅打印与键关联的值"text"

结果是 5 个字符串,然后将其打印出来。

这种管道非常常见,所以我们可以这样做:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ curl -s 'https://cat-fact.herokuapp.com/facts' | jq '.<span style="color:var(--syntax-text-color)">[]</span> | .text'
<span style="color:var(--syntax-string-color)">"Cats make about 100 different sounds. Dogs make only about 10."</span>
<span style="color:var(--syntax-string-color)">"Domestic cats spend about 70 percent of the day sleeping and 15 percent of the day grooming."</span>
<span style="color:var(--syntax-string-color)">"I don't know anything about cats."</span>
<span style="color:var(--syntax-string-color)">"The technical term for a cat’s hairball is a bezoar."</span>
<span style="color:var(--syntax-string-color)">"Cats are the most popular pet in the United States: There are 88 million pet cats and 74 million dogs."</span>
</code></span></span>

 

使用 jq 作为计算器

一个有趣的事实 - 数字是有效的 JSON 对象!

所以我们可以这样做:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ seq 1 10 | jq '(. / 10) + 2'
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3
</code></span></span>

 

seq生成十个有效的 JSON 文档(123, ..., 10,每个都在自己的行上,但对于 来说并不重要jq)。(. / 10) + 2然后 JSON在每个文件上运行,.当前文档在哪里。然后它打印每个文档。

统一码

有趣的事实 - jq 可以正确处理 Unicode,尽管 JavaScript 不能(并回答最后一个问题的 2)。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ echo '["Hello", "Żółw", "🍰"]' | jq '.[] | length'
5
4
1
</code></span></span>

 

空输入

除了 JSON 输入之外,JQ 还可以通过多种方式使用。例如,空输入让它可以用作纯生成器。它还可以将输入作为每行字符串、一个大字符串以及其他一些模式。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ jq --<span style="color:var(--syntax-declaration-color)">null</span>-input  'range(<span style="color:var(--syntax-literal-color)">1</span>;<span style="color:var(--syntax-literal-color)">11</span>) | <span style="color:var(--syntax-text-color)">{</span>number: .<span style="color:var(--syntax-text-color)">,</span> (if . % <span style="color:var(--syntax-literal-color)">2</span> == <span style="color:var(--syntax-literal-color)">0</span> then <span style="color:var(--syntax-string-color)">"even"</span> else <span style="color:var(--syntax-string-color)">"odd"</span> end): <span style="color:var(--syntax-declaration-color)">true</span> <span style="color:var(--syntax-text-color)">}</span>'
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"odd"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"even"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">3</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"odd"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">4</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"even"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">5</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"odd"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">6</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"even"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">7</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"odd"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">8</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"even"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">9</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"odd"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">{</span>
  <span style="color:var(--syntax-text-color)">"number"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">10</span><span style="color:var(--syntax-text-color)">,</span>
  <span style="color:var(--syntax-text-color)">"even"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-declaration-color)">true</span>
<span style="color:var(--syntax-text-color)">}</span>
</code></span></span>

 

这是怎么回事:

  • jq --null-input ...基本上是一样的echo null | jq ...- JSON 文档只是一个null
  • range(1;11)生成从 1 到 10 的数字序列,然后我们将其输送到下一阶段 - 我仍然认为默认范围约定应该是,range(start, end)但一半的编程语言这样做range(start, end+1),所以 jq 在这里没什么特别的
  • 我们将这十个 JSON 文档 ( 12, ..., 10) 通过管道传输到第二阶段
  • 第二阶段构造一个带有两个键的 JSON 对象
  • number等于输入文档
  • 第二个键的计算结果为(if . % 2 == 0 then "even" else "odd" end)- 您基本上可以使用任何表达式作为键,但如果它很复杂,您可能需要将其括起来 - 所以它将是{"even": true}{"odd": true}

菲兹巴兹

JQ 不支持独立脚本#!/usr/bin/env jq,但支持模块文件和函数。

所以让我们尝试一下,创建fizzbuzz.jq

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">fizzbuzz</span><span style="color:var(--syntax-text-color)">:</span>
  <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-literal-color)">15</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-literal-color)">0</span>
  <span style="color:var(--syntax-text-color)">then</span> <span style="color:var(--syntax-string-color)">"FizzBuzz"</span>
  <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-literal-color)">5</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-literal-color)">0</span>
  <span style="color:var(--syntax-text-color)">then</span> <span style="color:var(--syntax-string-color)">"Buzz"</span>
  <span style="color:var(--syntax-declaration-color)">elif</span> <span style="color:var(--syntax-text-color)">.</span> <span style="color:var(--syntax-error-color)">%</span> <span style="color:var(--syntax-literal-color)">3</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-literal-color)">0</span>
  <span style="color:var(--syntax-text-color)">then</span> <span style="color:var(--syntax-string-color)">"Buzz"</span>
  <span style="color:var(--syntax-declaration-color)">else</span> <span style="color:var(--syntax-string-color)">"\(.)"</span>
  <span style="color:var(--syntax-text-color)">end</span>
<span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

;是必要的,并且"\(.)"是字符串插值语法。

让我们尝试一下:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ seq 1 20 | jq 'include "fizzbuzz"; fizzbuzz'
"1"
"2"
"Buzz"
"4"
"Buzz"
"Buzz"
"7"
"8"
"Buzz"
"Buzz"
"11"
"Buzz"
"13"
"14"
"FizzBuzz"
"16"
"17"
"Buzz"
"19"
"Buzz"
</code></span></span>

 

与标准 FizzBu​​zz 相比,它们有额外的引号,但这使它们成为有效的 JSON 文档,我认为这更符合我们正在做的事情的精神。但如果您不喜欢它,您可以使用以下命令将输出模式更改为原始-r

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ seq 1 20 | jq -r 'include "fizzbuzz"; fizzbuzz'
1
2
Buzz
4
Buzz
Buzz
7
8
Buzz
Buzz
11
Buzz
13
14
FizzBuzz
16
17
Buzz
19
Buzz
</code></span></span>

 

斐波那契

用 jq 做斐波那契数列并不难。首先让我们创建fib.jq

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span><span style="color:var(--syntax-text-color)">):</span>
  <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)"><=</span> <span style="color:var(--syntax-literal-color)">2</span>
  <span style="color:var(--syntax-text-color)">then</span> <span style="color:var(--syntax-literal-color)">1</span>
  <span style="color:var(--syntax-declaration-color)">else</span> <span style="color:var(--syntax-text-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">-</span> <span style="color:var(--syntax-literal-color)">1</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-error-color)">+</span> <span style="color:var(--syntax-text-color)">fib</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">n</span> <span style="color:var(--syntax-error-color)">-</span> <span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">)</span>
  <span style="color:var(--syntax-text-color)">end</span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>

 

然后我们可以运行它,生成包含有效答案的 JSON 数组:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>$ jq --null-input 'include "fib"; [range(1;21) | fib(.)]'
[
  1,
  1,
  2,
  3,
  5,
  8,
  13,
  21,
  34,
  55,
  89,
  144,
  233,
  377,
  610,
  987,
  1597,
  2584,
  4181,
  6765
]
</code></span></span>

 

当我们将代码包装在 中时[],它会生成一个数组,而不是许多单独的 JSON 文档。

你应该使用JQ吗?

就特定于领域的语言而言,JQ 非常直观、非常简洁,而且非常擅长它所做的事情。它没有分享我最近审查的 XSLT 的任何失败之处。该代码实际上是正确设计的语言,而不是带有特殊代码节点的 JSON。

这种暴行肯定会发生在 JSON 上,MongoDB 查询语言的作用与 JQ 类似,但它将代码表示为 JSON 对象,用$-nodes 表示代码节点,因此除了最简单的情况之外,它对于任何东西都是完全不可读的。如果你不相信我,试试这个转换器,给它任何聚合 SQL 查询,然后哭泣

即使当超出其最初目的时,例如当我们尝试进行 FizzBu​​zz 或 Fibonacci 时,JQ 仍然处理得非常好。

我认为它的 shell one 衬垫的主要竞争对手是 Ruby。如果您是 Ruby 程序员,已经习​​惯使用 Ruby 来编写 shell 行话,那么 JQ 只提供了适度的改进:JQ 更简洁,但您已经了解 Ruby,并且 Ruby 行话可以轻松成长为适当的脚本,而 JQ 行话可以轻松发展为适当的脚本一旦变得太复杂,就需要用另一种语言完全重写。您可能仍然会从学习 JQ 中受益,但这取决于您。

如果您在类 Unix 环境中处理大量 JSON 数据(现在我们大多数人都是这样),并且您不了解 Ruby,那么我强烈建议您至少学习 JQ 的基础知识。

无论哪种方式,如果您达到了编写大型 JQ 模块文件的程度,那么也许是时候重新考虑它并使用通用语言来代替。幸运的是,JQ 通过很好地处理简单的案例提供了很多价值。

 


关注我的博客,您将在其中获得提示、技巧和挑战,以保持您的技能敏锐。记得关注我哦!

...全文
22 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6

社区成员

发帖
与我相关
我的任务
社区描述
分享
java-rocketmqpygame前端 个人社区 广东省·广州市
社区管理员
  • Q shen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧