6
社区成员
发帖
与我相关
我的任务
分享JSON 实际上实现了 XML 承诺的功能,并成为一种近乎通用的数据交换格式。
每种编程语言都可以很好地处理 JSON,但有时您不想编写整个程序 - 您宁愿只编写一个 shell 单行代码,就像您可以使用的那样grep。jq就是这么做的。
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 进行任何操作之前,让我们回答一个简单的问题 - 我们是否需要它。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 做得非常好。
但是等等,如果我们将所有样板代码放入脚本中会怎样?让我们为 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>
一个有趣的事实 - 数字是有效的 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 文档(1, 2, 3, ..., 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 文档只是一个nullrange(1;11)生成从 1 到 10 的数字序列,然后我们将其输送到下一阶段 - 我仍然认为默认范围约定应该是,range(start, end)但一半的编程语言这样做range(start, end+1),所以 jq 在这里没什么特别的1, 2, ..., 10) 通过管道传输到第二阶段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>
与标准 FizzBuzz 相比,它们有额外的引号,但这使它们成为有效的 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 非常直观、非常简洁,而且非常擅长它所做的事情。它没有分享我最近审查的 XSLT 的任何失败之处。该代码实际上是正确设计的语言,而不是带有特殊代码节点的 JSON。
这种暴行肯定会发生在 JSON 上,MongoDB 查询语言的作用与 JQ 类似,但它将代码表示为 JSON 对象,用$-nodes 表示代码节点,因此除了最简单的情况之外,它对于任何东西都是完全不可读的。如果你不相信我,试试这个转换器,给它任何聚合 SQL 查询,然后哭泣。
即使当超出其最初目的时,例如当我们尝试进行 FizzBuzz 或 Fibonacci 时,JQ 仍然处理得非常好。
我认为它的 shell one 衬垫的主要竞争对手是 Ruby。如果您是 Ruby 程序员,已经习惯使用 Ruby 来编写 shell 行话,那么 JQ 只提供了适度的改进:JQ 更简洁,但您已经了解 Ruby,并且 Ruby 行话可以轻松成长为适当的脚本,而 JQ 行话可以轻松发展为适当的脚本一旦变得太复杂,就需要用另一种语言完全重写。您可能仍然会从学习 JQ 中受益,但这取决于您。
如果您在类 Unix 环境中处理大量 JSON 数据(现在我们大多数人都是这样),并且您不了解 Ruby,那么我强烈建议您至少学习 JQ 的基础知识。
无论哪种方式,如果您达到了编写大型 JQ 模块文件的程度,那么也许是时候重新考虑它并使用通用语言来代替。幸运的是,JQ 通过很好地处理简单的案例提供了很多价值。
关注我的博客,您将在其中获得提示、技巧和挑战,以保持您的技能敏锐。记得关注我哦!