JSONをコマンドラインから作るのが面倒だったのでそれ用のコマンドを作った

github.com

mkdictという名前(あとで名前は変えるかもしれない)。

使いかた

すごくシンプルな文法。内部的にはshlexパッケージを使っている。標準ライブラリだけである程度手軽にシェルっぽい文法に対応できるのは便利(punctuation_charsオプションに対応しているのが3.6空だったことにショックを受けたりしてた)。

$ dictknife mkdict --name foo --age 20
{
  "name": "foo",
  "age": 20
}

実はオプション引数の形式である必要はなく。以下でも同じ意味。

$ dictknife mkdict name foo age 20
{
  "name": "foo",
  "age": 20
}

こうでも大丈夫。

$ dictknife mkdict --name=foo --age=20
{
  "name": "foo",
  "age": 20
}

quote

quoteはちょっと不親切。

$ dictknife mkdict --message='"foo --age 20"'
{
  "message": "foo --age 20"
}

# これでも大丈夫にしたいのだけれど。。
$ dictknife mkdict --message='foo --age 20'
{
  "message": "foo",
  "age": 20
}

追記

直した。

$ dictknife mkdict --message='"foo --age 20"'
{
  "message": "foo --age 20"
}

# 大丈夫
$ dictknife mkdict --message='foo --age 20'
{
  "message": "foo --age 20"
}

重複した場合

重複した場合には後のものが優先される。

$ dictknife mkdict --name foo --age 20 --name bar
{
  "name": "bar",
  "age": 20
}

ネストした値

ネストした構造を作りたい場合には"/"で区切る。

$ dictknife mkdict name foo age 20 father/name X mother/name Y
{
  "name": "foo",
  "age": 20,
  "father": {
    "name": "X"
  },
  "mother": {
    "name": "Y"
  }
}

区切り文字を変えたい場合には--separatorで指定する。

dictknife mkdict --separator=. name foo age 20 father.name X mother.name Y
{
  "name": "foo",
  "age": 20,
  "father": {
    "name": "X"
  },
  "mother": {
    "name": "Y"
  }
}

複数の値を表示したい場合

";"で区切る。

$ dictknife mkdict --name foo --age 20 ";" --name bar
[
  {
    "name": "foo",
    "age": 20
  },
  {
    "name": "bar"
  }
]

--squash をつけるとリストではなく分割された値になる。

$ dictknife mkdict --squash --name foo --age 20 ";" --name bar
{
  "name": "foo",
  "age": 20
}
{
  "name": "bar"
}

追記

標準入力から取れるようにもした

input.txt

name foo age 20
name bar age 21
name "foo bar boo" age 20 x/nickname x

ここで

$ cat input.txt | dictknife mkdict
[
  {
    "name": "foo",
    "age": 20
  },
  {
    "name": "bar",
    "age": 21
  },
  {
    "name": "foo bar boo",
    "age": 20,
    "x": {
      "nickname": "x"
    }
  }
]

(jqfpyを使って一行毎に)

$ cat input.txt | dictknife mkdict | jqfpy --compact --squash
{"name": "foo", "age": 20}
{"name": "bar", "age": 21}
{"name": "foo bar boo", "age": 20, "x": {"nickname": "x"}}