100言語Spedrdrun :エピソード25 : JQ
20347 ワード
JSONは実際にXMLが何を約束したかをして、ほぼ一般的なデータ交換形式になりました.
JSONだけをうまく扱うことができますが、プログラム全体を書くことはできません.プログラム全体を書きたくない場合もあります
それで、この1通の手紙
実際のスクリプトを書きましょう.
最も有効なJSONを
JQで何かをする前に、簡単な質問に答えましょう.シェルの1つのライナーに使用できる2つの最も近い汎用プログラミング言語はRubyとPerlであるでしょう.
この例をRubyに翻訳するなら、
しかし、我々がスクリプトにすべてのそのboilerplateコードを押すならば、何を待ってください.ルビーのスーパーショートラッパーを作りましょう
ではどうですか.
今まで私はそれを暗示していた
JSON文書は自己閉鎖ですので、それらの任意の数を連結することができます.この種の「JSONストリーム」はかなり一般的です、そして、通常、そのようなシステムは1行につき1つのJSON文書を持っています、しかし、それはJQによって強制されません-それはどんな方法ででも生成されるJSONを受け入れます.
だからいくつかの猫の事実を試してみましょう.
結果は5文字列で、それから出力されます.
この種のパイプライン処理はとても一般的です.
楽しい事実-数は、有効なJSONオブジェクトです!
それでこうすることができます.
楽しい事実- JQは正しく、しかし、JavaScriptがしないUnicodeを処理します(そして、最後の1に答え2).
JSONはJSON入力以外のいくつかの方法で使用できます.例えば、NULL入力は純粋な発電機として使用されます.また、1つの大きな文字列、およびいくつかの他のモードとして行ごとに文字列として入力を取ることができます.
私たちは、それらの10のJSON文書をパイプします 番目のステージは2つのキーでJSONオブジェクトを構築します 番目のキーは
JQはスタンドアロンスクリプトをサポートしていません
それで、それを試みましょう
行きましょう:
フィボナッチをJQでやるのは難しくない.最初に作ろう
ドメイン固有の言語が行く限り、JQは非常に直感的で、非常に簡潔で、本当にそれが何をしているかについて良いです.それは最近XSLTの失敗のいずれかを共有していません.コードは実際に適切に設計された言語で、コード用の特殊なノードを持つJSONではありません.
そして、この残虐行為は確かにJSONに起こることができます.MongoDB query language JQに似た役割を果たしますが、JSONオブジェクトとしてコードを表します
オリジナルの目的の外でプッシュしたときでも、私たちがfizzbuzzまたはfibonacciをしようとしたときのように、JQはまだ非常によくそれ自体を取り扱いました.
私は、シェルの1つのライナーの主な競争相手がルビーであると思います.あなたがRubyプログラマがシェルの1つのライナーのためにすでにRubyを使用することで快適であるならば、JQはささやかな改善だけを提供します:JQはより簡潔です、しかし、あなたはすでにRubyを知っています、そして、Ruby 1ライナーは容易に適当なスクリプトに成長することができます、一方、JQ Onelinersは彼らがあまりに複雑になるならば、もう一つの言語で完全な書き換えを必要とするでしょうが.あなたはまだJQの学習の恩恵を受けるかもしれませんが、それはあなた次第です.
UNIXのような環境で多くのJSONデータを使って動作している場合(そして最近ではほとんどの場合)、Rubyを知らない場合は、JQの基礎を学ぶことをお勧めします.
いずれにせよ、あなたが大きなJQモジュールファイルを書いている点に到達したならば、多分それを再考する時間であり、代わりに汎用言語を使用します.幸いなことにJQは本当に簡単なケースを扱うだけで価値がたくさん提供しています.
All code examples for the series will be in this repository .
Code for the JQ episode is available here .
JSONだけをうまく扱うことができますが、プログラム全体を書くことはできません.プログラム全体を書きたくない場合もあります
grep
など.jq
それだけです.jq
主にコマンドラインまたはシェルスクリプトとして使用されますが、このエピソードの目的のために、私たちはまた、それがどのように短いスタンドアロンプログラム(あなたがシェルから呼ぶか)を書くために働く方法をチェックします.きれいな印刷
jq
かなりデフォルトで出力を出力します-そして、出力が端末であるならば、色もそれをコード化します..
入力文書全体を参照します.それで、この1通の手紙
jq
プログラムはすでに役に立つ何かをしています.$ echo '{"name": "Alice", "surname": "Smith"}' | jq .
{
"name": "Alice",
"surname": "Smith"
}
Web開発のための非常に一般的なパターンはcurl
いくつかのWeb APIから、何か| jq .
それをかなり印刷するのを見るために.こんにちは、世界!
実際のスクリプトを書きましょう.
最も有効なJSONを
jq
そして、その部分はちょうど印刷されます..name
は"name"
フィールド.
JSONのトップレベル.$ echo '{"name": "Alice", "surname": "Smith"}' | jq '{"hello": .name}'
{
"hello": "Alice"
}
JQも必要ですか?
JQで何かをする前に、簡単な質問に答えましょう.シェルの1つのライナーに使用できる2つの最も近い汎用プログラミング言語はRubyとPerlであるでしょう.
この例をRubyに翻訳するなら、
$ echo '{"name": "Alice", "surname": "Smith"}' | ruby -rjson -e 'data=JSON.parse(STDIN.read); puts JSON.pretty_generate(hello: data["name"])'
{
"hello": "Alice"
}
またはPerlで$ echo '{"name": "Alice", "surname": "Smith"}' | perl -e 'use JSON; $_=decode_json(<>); print JSON->new->ascii->pretty->encode({"hello"=>$_->{"name"}})'
{
"hello" : "Alice"
}
これらはひどいではないが、それはボイラープレートの良い取引です.私たちがきれいな印刷をスキップするならば、彼らはもう少し簡潔です.今までのところ、JQは本当に元気です.JQも必要ですか?本当に好き?
しかし、我々がスクリプトにすべてのそのboilerplateコードを押すならば、何を待ってください.ルビーのスーパーショートラッパーを作りましょう
rq
. JSONを読み込み、コマンドラインで渡されたRubyコードを無効にし、結果を出力します.#!/usr/bin/env ruby
require "json"
$_ = JSON.parse(STDIN.read)
$_ = eval(ARGV[0])
puts JSON.pretty_generate($_)
もちろん、私たちが本当のスクリプトを作ったならば、我々はかなりの印刷をオンまたはオフにするためにいくつかのコマンドラインオプションを加えて、出力を着色します.しかし、我々はちょうどここで問題を調査しています.ではどうですか.
$ echo '{"name": "Alice", "surname": "Smith"}' | rq '{hello: $_["name"]}'
{
"hello": "Alice"
}
それはJQと本当に競争力があります、そして、それは10年までにJSONを先行する言語です!RubyのJSON処理用のJQと同じようにRubyは良いとは思いませんが、RubyやPythonのような一番上の言語を知っているパワーがどれくらいのパワーを持つかを示しています.猫事実
今まで私はそれを暗示していた
jq
JSONドキュメントを入力として取得し、そのコードを実行し、出力としてJSONドキュメントを生成します.それはまったく正確ではない.それが実際に何をするかは、JSON文書の任意の数を取得し、それぞれのコードを実行し、すべての結果を出力します.JSON文書は自己閉鎖ですので、それらの任意の数を連結することができます.この種の「JSONストリーム」はかなり一般的です、そして、通常、そのようなシステムは1行につき1つのJSON文書を持っています、しかし、それはJQによって強制されません-それはどんな方法ででも生成されるJSONを受け入れます.
だからいくつかの猫の事実を試してみましょう.
$ curl -s 'https://cat-fact.herokuapp.com/facts' | jq '.[]` | jq '.text'
"Cats make about 100 different sounds. Dogs make only about 10."
"Domestic cats spend about 70 percent of the day sleeping and 15 percent of the day grooming."
"I don't know anything about cats."
"The technical term for a cat’s hairball is a bezoar."
"Cats are the most popular pet in the United States: There are 88 million pet cats and 74 million dogs."
cat fact apiそれに5つのオブジェクトを持つ配列を返すyou can see it here ).jq .[]
各ドキュメントを取得し、実行.[]
その上に.[]
それぞれのトップレベルの値(配列またはオブジェクトのいずれか)をそれ自身のドキュメントとして出力します.jq .text
各ドキュメントを取得し、実行.text
その上に.text
は"text"
キー.結果は5文字列で、それから出力されます.
この種のパイプライン処理はとても一般的です.
$ curl -s 'https://cat-fact.herokuapp.com/facts' | jq '.[] | .text'
"Cats make about 100 different sounds. Dogs make only about 10."
"Domestic cats spend about 70 percent of the day sleeping and 15 percent of the day grooming."
"I don't know anything about cats."
"The technical term for a cat’s hairball is a bezoar."
"Cats are the most popular pet in the United States: There are 88 million pet cats and 74 million dogs."
計算機としてのJQの使用
楽しい事実-数は、有効なJSONオブジェクトです!
それでこうすることができます.
$ 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
seq
有効なJSONドキュメントを10個生成します1
, 2
, 3
, ..., 10
, それぞれの行に、それは問題ではないjq
). JSONの実行(. / 10) + 2
それらの各々、どこで.
カレントドキュメントです.その後、各ドキュメントを印刷します.ユニコード
楽しい事実- JQは正しく、しかし、JavaScriptがしないUnicodeを処理します(そして、最後の1に答え2).
$ echo '["Hello", "Żółw", "🍰"]' | jq '.[] | length'
5
4
1
NULL入力
JSONはJSON入力以外のいくつかの方法で使用できます.例えば、NULL入力は純粋な発電機として使用されます.また、1つの大きな文字列、およびいくつかの他のモードとして行ごとに文字列として入力を取ることができます.
$ jq --null-input 'range(1;11) | {number: ., (if . % 2 == 0 then "even" else "odd" end): true }'
{
"number": 1,
"odd": true
}
{
"number": 2,
"even": true
}
{
"number": 3,
"odd": true
}
{
"number": 4,
"even": true
}
{
"number": 5,
"odd": true
}
{
"number": 6,
"even": true
}
{
"number": 7,
"odd": true
}
{
"number": 8,
"even": true
}
{
"number": 9,
"odd": true
}
{
"number": 10,
"even": true
}
何が起こっているのかjq --null-input ...
と基本的に同じですecho null | jq ...
- JSONドキュメントはnull
range(1;11)
1から10までの数列のシーケンスを生成し、それから次のステージにパイプを入れますrange(start, end)
プログラミング言語の半分range(start, end+1)
したがって、JQはここで特別な何もありません1
, 2
, ..., 10
) 第2段階へnumber
は入力文書に等しい(if . % 2 == 0 then "even" else "odd" end)
- 基本的にどんな表現もキーとして使うことができますが、何か複雑であれば、それを括弧で括る必要があるかもしれません{"even": true}
or {"odd": true}
フィズバズ
JQはスタンドアロンスクリプトをサポートしていません
#!/usr/bin/env jq
, しかし、それはモジュールファイルと機能をサポートします.それで、それを試みましょう
fizzbuzz.jq
:def fizzbuzz:
if . % 15 == 0
then "FizzBuzz"
elif . % 5 == 0
then "Buzz"
elif . % 3 == 0
then "Buzz"
else "\(.)"
end
;
あれ;
が必要であり"\(.)"
は文字列補間構文です.行きましょう:
$ 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"
彼らは標準的なFizzBuzzと比較して余分な引用符を持っていますが、これが有効なJSON文書になるので、私はこれが我々がしていることの精神でより多くであると思います.しかし、あなたがそれを好まないならば、あなたは出力モードをRawで変えることができます-r
:$ 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
フィボナッチ
フィボナッチをJQでやるのは難しくない.最初に作ろう
fib.jq
:def fib(n):
if n <= 2
then 1
else fib(n - 1) + fib(n - 2)
end;
そして、有効な答えを持つJSON配列を生成します.$ 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
]
コードをラップする[]
, これは、別のJSONドキュメントの多くの代わりに、1つの配列を生成します.JQを使うべきですか?
ドメイン固有の言語が行く限り、JQは非常に直感的で、非常に簡潔で、本当にそれが何をしているかについて良いです.それは最近XSLTの失敗のいずれかを共有していません.コードは実際に適切に設計された言語で、コード用の特殊なノードを持つJSONではありません.
そして、この残虐行為は確かにJSONに起こることができます.MongoDB query language JQに似た役割を果たしますが、JSONオブジェクトとしてコードを表します
$
-コードノードのためのノード、および結果として、それは最も簡単な場合を除いて、完全に読めません.If you don't believe me, try this converter, give it any aggregate SQL query, and weep .オリジナルの目的の外でプッシュしたときでも、私たちがfizzbuzzまたはfibonacciをしようとしたときのように、JQはまだ非常によくそれ自体を取り扱いました.
私は、シェルの1つのライナーの主な競争相手がルビーであると思います.あなたがRubyプログラマがシェルの1つのライナーのためにすでにRubyを使用することで快適であるならば、JQはささやかな改善だけを提供します:JQはより簡潔です、しかし、あなたはすでにRubyを知っています、そして、Ruby 1ライナーは容易に適当なスクリプトに成長することができます、一方、JQ Onelinersは彼らがあまりに複雑になるならば、もう一つの言語で完全な書き換えを必要とするでしょうが.あなたはまだJQの学習の恩恵を受けるかもしれませんが、それはあなた次第です.
UNIXのような環境で多くのJSONデータを使って動作している場合(そして最近ではほとんどの場合)、Rubyを知らない場合は、JQの基礎を学ぶことをお勧めします.
いずれにせよ、あなたが大きなJQモジュールファイルを書いている点に到達したならば、多分それを再考する時間であり、代わりに汎用言語を使用します.幸いなことにJQは本当に簡単なケースを扱うだけで価値がたくさん提供しています.
コード
All code examples for the series will be in this repository .
Code for the JQ episode is available here .
Reference
この問題について(100言語Spedrdrun :エピソード25 : JQ), 我々は、より多くの情報をここで見つけました https://dev.to/taw/100-languages-speedrun-episode-25-jq-486hテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol