PerlでJSONを扱う際に、jqのようにスマートにデータを抽出・整形できたらいいなと思ったことはありませんか?
そこで、jqライクな文法でJSONを操作できる軽量モジュール
👉 JQ::Lite
を作成&CPANに公開しました。
🔧 JQ::Liteとは?
JQ::Lite
は、Perl上で jq のような記述でJSONデータを処理できる純Perl製のモジュールです。
特徴
- ✅ Pure Perl(XS・外部バイナリ不要)
- ✅ ドット記法 (
.users[].name
) - ✅ オプショナルアクセス (
.nickname?
) - ✅ 配列インデックスや展開 (
.users[0]
,.users[]
) - ✅
select(...)
による絞り込み(比較演算・論理演算対応) - ✅ 組み込み関数多数:
length
,keys
,first
,last
,reverse
,sort
,unique
,has
- ✅ CLI対応:
jq-lite
コマンドでstdin
やファイルからも使える
📦 インストール方法
git clone https://github.com/kawamurashingo/JQ-Lite.git
cd JQ-Lite
perl Makefile.PL
make
make test
make install
CPANから直接:
cpanm JQ::Lite
🐪 Perlモジュールとして使う場合
use JQ::Lite;
my $json = '{"users":[{"name":"Alice"},{"name":"Bob"}]}';
my $jq = JQ::Lite->new;
my @names = $jq->run_query($json, '.users[].name');
print join("\n", @names), "\n";
💻 CLIツールとして使う場合
cat users.json | jq-lite '.users[].name'
jq-lite '.users[] | select(.age > 25)' users.json
jq-lite -r '.users[].name' users.json
※
jq-lite
という名前は本家jq
と競合しないようにしています。
🧪 JSON例とクエリ例
入力(users.json
)
{
"users": [
{
"name": "Alice",
"age": 30,
"profile": {
"active": true,
"country": "US"
}
},
{
"name": "Bob",
"age": 25,
"profile": {
"active": false,
"country": "JP"
}
}
]
}
クエリ例
クエリ | 説明 |
---|---|
.users[].name |
全ユーザーの名前を抽出 |
`.users | length` |
`.users[0] | keys` |
.users[].nickname? |
nicknameがあれば取得(なければスキップ) |
.users[] | select(.age > 25) |
年齢が25より上のユーザー |
.users[] | select(.profile.active == true) | .name |
activeなユーザーの名前 |
🤔 どう使い分ける?
やりたいこと | ツール |
---|---|
JSONのシンプルなデコード | JSON::PP |
Bashなどでの高度なJSON処理 | jq |
Perlの中でjqっぽく書きたい | JQ::Lite |
軽量&移植性重視でCLIにも使いたい | JQ::Lite |
🔗 関連リンク
- 🐫 CPAN: JQ::Lite
- 🐙 GitHub: https://github.com/kawamurashingo/JQ-Lite
👋 最後に
Perlの中でも 軽快にjq風のクエリを扱いたい というニーズに応えるモジュールです。
フィルタやソート、配列処理などがスッキリ書けて、ワンライナー的にも使いやすいはずです。
ぜひ使ってみて、不具合や要望などあればGitHubのIssueで教えてください!
Starもいただけると励みになります⭐