LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

解決したい課題

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
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0