joとdictknifeのmkdictを比べてみる

github.com

jo

JSONコマンドラインから作るコマンド。

github.com

joの例を翻訳してみる

joのページにある例を翻訳してみる。

簡単な例。

$ jo name=Jane
{"name":"Jane"}
$ dictknife mkdict name Jane
{
  "name": "Jane"
}

コマンドを使った例

$ jo time=$(date +%s) dir=$HOME
{"time":1553782875,"dir":"/home/nao"}
$ dictknife mkdict time $(date +%s) dir $HOME
{
  "time": 1553782897,
  "dir": "/home/nao"
}

ネストしたもの。

$ jo person=$(jo name=foo age=20)
{"person":{"name":"foo","age":20}}
$ dictknife mkdict person/name foo person/age 20
{
  "person": {
    "name": "foo",
    "age": 20
  }
}

配列的なもの。意外と文字列のリストが鬼門だった。jsonpointer的なものを想定しているので""と"/"は別物。区切り文字(delimiter)を越えると配列になる。

$ jo -p -a spring summer winter
[
   "spring",
   "summer",
   "winter"
]
$ dictknife mkdict "" spring ";" "" summer ";" "" winter
[
  "spring",
  "summer",
  "winter"
]

あるいはヒアドキュメントで

$ dictknife mkdict << EOS
"" spring
"" summer
"" winter
EOS
[
  "spring",
  "summer",
  "winter"
]

ネストしたもの。

$ jo -p name=JP object=$(jo fruit=Orange point=$(jo x=10 y=20) number=17) sunday=false
{
   "name": "JP",
   "object": {
      "fruit": "Orange",
      "point": {
         "x": 10,
         "y": 20
      },
      "number": 17
   },
   "sunday": false
}
$ dictknife mkdict name JP object/fruit Orange object/point/x 10 object/point/y 20 object/number 17 sunday false
{
  "name": "JP",
  "object": {
    "fruit": "Orange",
    "point": {
      "x": 10,
      "y": 20
    },
    "number": 17
  },
  "sunday": false
}

もう1つの複雑な例。"/"で終わるものは配列の要素になる(append)。

$ jo -p number=17 pass=true geo[lon]=88 geo[cc]=ES point[]=1 point[]=2 geo[lat]=123.45
{
   "number": 17,
   "pass": true,
   "geo": {
      "lon": 88,
      "cc": "ES",
      "lat": 123.45
   },
   "point": [
      1,
      2
   ]
}
$ dictknife mkdict number 17 pass true ge/lon 88 geo/cc ES geo/lat 123.45 point/ 1 point/ 2
{
  "number": 17,
  "pass": true,
  "ge": {
    "lon": 88
  },
  "geo": {
    "cc": "ES",
    "lat": 123.45
  },
  "point": [
    1,
    2
  ]
}

変数と参照

そういえば変数と参照を持っている。

$ dictknife mkdict @ob/name "foo" @ob/age 20 id 1 "" "&ob" ";" id 2 "" "&ob"
[
  {
    "id": 1,
    "name": "foo",
    "age": 20
  },
  {
    "id": 2,
    "name": "foo",
    "age": 20
  }
]

joと違って再帰的には作れないかも。