Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@oz-urabe

大きな json の中身を jq コマンドで探検してみる

More than 1 year has passed since last update.

解決したい課題

json の構造についてのドキュメントがない状態で、巨大な json ファイルの中身を調べたい!だけどあまりにも巨大なファイルなので、途方にくれている

こういった場合、みなさんはどのように調べますでしょうか

GUI のツールを使うのもありですが、コマンドラインでパースした結果を別のコマンドに渡したい場合、それだとやりにくかったりしますね。

解決策

jq コマンドを利用する

例: AWS の IP 一覧 があります。これを探検してみましょう。

jq コマンドには多数の機能が用意されています。

単純に jq コマンドに渡すだけだと、まあ以下のように長ーい結果が帰ってきます

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq 
{
  "syncToken": "1581352989",
  "createDate": "2020-02-10-16-43-09",
  "prefixes": [
    {
      "ip_prefix": "13.248.118.0/24",
      "region": "eu-west-1",
      "service": "AMAZON"
    },
    {
      "ip_prefix": "18.208.0.0/13",
      "region": "us-east-1",
      "service": "AMAZON"
    },
    {
      "ip_prefix": "52.95.245.0/24",
      "region": "us-east-1",
      "service": "AMAZON"
    },
    {
... snip ...

行数も 12923 行

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq |wc -l
   12923

まず、自分の場合は keys という機能を使います。
これを使うことで、大枠の構造がわかります。

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq keys
[
  "createDate",
  "ipv6_prefixes",
  "prefixes",
  "syncToken"
]

4つのオブジェクトのキーが最初の構成で使われているようです

createDate が何なのか見てみましょう
キー名の先頭にドットをつけて 検索します。

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq .createDate
"2020-02-10-16-43-09"

2020-02-10-16-43-09 という文字列が返ってきました。文字列が返ってきました。ここについてはこれ以上の階層ではないようです。

では ipv6_prefixes を見てみましょう

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq .ipv6_prefixes
[
  {
    "ipv6_prefix": "2a05:d07c:2000::/40",
    "region": "eu-west-3",
    "service": "AMAZON"
  },
  {
    "ipv6_prefix": "2600:9000:a300::/40",
    "region": "GLOBAL",
    "service": "AMAZON"
  },
  {
    "ipv6_prefix": "2a05:d000:8000::/40",
    "region": "eu-west-1",
    "service": "AMAZON"
  },
  {
    "ipv6_prefix": "2406:dafe:2000::/40",
    "region": "ap-northeast-2",
    "service": "AMAZON"
... snip ...


$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq .ipv6_prefixes|wc -l
    2802

2802 行もあるようです。かなりの数が返ってきました。
構造をみてみましょう。 ".ipv6_prefixes|keys" のようにキーの後ろにパイプをつけて keys をつければOKです

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq ".ipv6_prefixes|keys"|head -10
[
  0,
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,

0 から始まる数字のキーが返ってきました。配列のようです。
配列の中の構造も更に見てみましょう。仮うちで 0 の配列の中身を見てみます

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq ".ipv6_prefixes[0]|keys"
[
  "ipv6_prefix",
  "region",
  "service"
]

こうすることで、配列の中身は3つのキーが含まれるオブジェクトであることがわかりました
さらに 調べてみましょう。

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq ".ipv6_prefixes[0].ipv6_prefix | keys"
jq: error (at <stdin>:12922): string ("2a05:d07c:...) has no keys

文字列なのでキーはないよと怒られました。
他のキーを調べてみても同様なので、keys をはずしてみました

$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq ".ipv6_prefixes[0]"
{
  "ipv6_prefix": "2a05:d07c:2000::/40",
  "region": "eu-west-3",
  "service": "AMAZON"
}

こうすることで、巨大な json であっても、必要な情報にたどり着くことができます

といろいろ書きましたが、この json はちゃんとドキュメントが書かれているので、そういう場合はドキュメント見るとよいですw

ただ、開発でデバッグする際に何か json の構造がおかしい場合に知っておいて損はないかと思います。

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
oz-urabe
WEBアプリ開発・WEBセキュリティ・AWS について関わるサービスを提供をしています。 ハピタスというポイントモールサイトの管理をメインに行っています。 趣味はバイク(ハーレー乗りたい)と猫 wantedly: https://www.wantedly.com/users/69700156
ozvision
購買プラットフォーム「ハピタス」を開発・運営するベンチャー企業

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?