Skip to main content

json

json(JavaScript Object Notation)

  • object is unordered set of name/value pair.
  • array is ordered set of values
  • value can be number, string, boolean(true or false), null, object or array.

    { "number": 128, "string": "128", "boolean": true, "null": null, "object": { "key0": "value0" }, "array": [ 128, "128", true, null, { "key1": "value1" } ] }

jq

jq is command line json processor. How to install jq in debian.

apt-get install jq

Here we use result of below command as a sample json file. Of cource I know awscli has convinience options like filter and query.

aws ec2 describe-images \
--filters '[{"Name":"owner-id","Values":["136693071363"]},{"Name":"architecture","Values":["x86_64"]}]' > ami.json

内容全てを整形して出力

$ jq '.' ami.json

Images の子要素(配列)を全て出力

$ jq '.Images[]' amis.json

Images の子要素のうち Description が Test のものの内容を出力

$ jq '.Images[] | select(.Description == "Test")' ami.json

Not condition

$ jq '.Images[] | select(.Description == "Test" | not)' ami.json

Startswith

$ jq '.Images[] | select(.Description | startswith("Debian 10"))' ami.json

contains

$ jq '.Images[] | select(.Description | contains("202005"))' ami.json

Images の子要素のうち Description が Test のもののNameの値を出力

$ jq '.Images[] | select(.Description == "Test") | .Name' ami.json

Images の子要素のうち Description が Test のものの内容を整形して出力

$ jq '.Images[] | select(.Description == "Test") | {"MyName":.Name, "MyDate":.CreationDate}' ami.json

jqのコマンドをファイルから読み込むことができる。

$ cat ami.jq
.Images[] |
select(.Description == "Test") |
{
  "MyName":.Name,
  "MyDate":.CreationDate
}

$ jq -f ami.jq ami.json

シェバンを書けば、sed や awk のようにスクリプトとして実行することができる。

$ cat ami.jq
#! /usr/bin/jq -f
.Images[] |
select(.Description == "Test") |
{
  "MyName":.Name,
  "MyDate":.CreationDate
}

$ chmod +x ami.jq

$ ./ami.jq ami.json

adding value of add.json to ResourceRecordSet part of orig.json

$ jq . orig.json
{
  "Comment": "delete after certbot validation",
  "Changes": [
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "_acme-challenge.'${CERTBOT_DOMAIN}'.",
        "Type": "TXT"
      }
    }
  ]
}
$ jq . add.json 
{
  "ResourceRecords": [
    {
      "Value": "\"abcd1234\""
    }
  ],
  "TTL": 1800
}
$ jq '.Changes[0].ResourceRecordSet |= .+ '$(jq -c . add.json)'' orig.json
{
  "Comment": "delete after certbot validation",
  "Changes": [
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "_acme-challenge.'${CERTBOT_DOMAIN}'.",
        "Type": "TXT",
        "ResourceRecords": [
          {
            "Value": "\"abcd1234\""
          }
        ],
        "TTL": 1800
      }
    }
  ]
}