JSONを文字列に変換したいユースケース

JSONを文字列に変換したい場合がある。

ユースケースを一つ挙げるとREST APIでデータをJSONで送るときに、JSONのkey-valueのvalue自体にJSONを設定したいが、valueは文字列しか受け付けない場合。

もう少し具体的な例として話すと、JSONで暗号化したい文字列を渡すと暗号化してくれるAPIを考える。

{
  "encryptData": "何らかの文字列"
}

シンプルな文字列であればいいが、DBの接続URLとユーザー名とパスワードをまとめて暗号化したく、データ形式としてJSONを採用した場合を考える。

{ "url": "略", "user": "略", "password": "略" }を以下のように直接valueにセットしたいところだが、文字列しかvalueにはセットできないのでダブルクォーテーションで囲って文字列にする必要がある。

{
  "encryptData": { "url": "略", "user": "略", "password": "略" }
}

しかし、JSON自体にダブルクォーテーションが使われているため、ダブルクォーテーションをエスケープしなければならない。

{
  "encryptData": "{\"url\":\"略\",\"user\":\"略\",\"password\":\"略\"}"
}

このようなときにエスケープ処理を施した上で文字列に変換してくれる機能がjqに存在する。

jqの@text

実際に使ってみる。

$ echo '{ "key": "value" }' | jq .
{
  "key": "value"
}


$ echo '{ "key": "value" }' | jq @text
"{\"key\":\"value\"}"